回答

收藏

如何判断查询能否很好地扩展?

技术问答 技术问答 110 人阅读 | 0 人回复 | 2023-09-14

有经验的SQL开发人员可以使用哪些方法/技术来确定特定的方法/技术SQL查询是否会随着负载的增加和相关表中行的增加而扩大。
" G/ H; ]5 D9 M' E" B                                                                ( A- _, w* o& H8 U5 B7 F
    解决方案:                                                                5 c+ ]& T6 l) V- U
                                                                我遵循的一些规则最重要。
. v0 A; @: Z5 t6 d: ]不要    在您的查询中,如使用每排功能if,case,coalesce等等。即使涉及重复数据,也要将数据放入您需要的格式数据库中。
5 @! u8 c2 \5 m2 Z" X例如,如果您需要快速找到姓氏,则以输入的形式 和    以小写的形式存储,并索引小写的形式。这样你就不用担心这样的事情了。select * from tblwhere lowercase(surname) = 'smith';* |4 L. k4 l1 T: A+ i, ^2 h
是的,我知道这会破坏3NF,但您仍然可以使用触发器或预先计算的列来确保数据的完整性。例如,表上的插入/更新触发器可以被迫使用lower_surname列设置为小写版surname。8 s/ }% R3 B* d' O" d2 d  B
这将转移转换成本insert/update而从select(更多)。你基本上会摊销转换成本。2 Z. ^& M. |; u# ^) Q
确保where子句中使用的每个列都已建立索引。不一定要单独使用,但至少要作为组合键的主要部分。
8 X' w2 W/ A2 j4 A/ y& R( R$ c$ X- ?( Z始终从3NF刚开始只有性能问题( 生产中    3.NF它通常是最容易处理的,只有在绝对必要时才能恢复。
, j! \; ]& _+ E# B5 f$ y只要您有生产数据和模式,生产中的配置文件(或其他位置)。除非表中的数据永远不会改变(非常罕见),否则数据库调整不是一劳永逸的操作。您应定期监控并可能进行调整,以避免更改数据以降低性能的可能性。+ k" m: \# L0 n$ p
除非绝对必要,否则不要裸体查询您的数据库。试着控制可以运行的查询。如果有经理可以加入并开始工作,那么你就是DBA工作会变得更加困难:
# N( U$ i, V) j1 y1 ~8 C0 Gselect * from very_big_table order by column_without_index;在您的数据库中。. }$ `) _( }% Y# k8 W8 z+ e
如果经理想运行即席查询,请为他们提供克隆DBMS(或副本),使您的实际用户(需要性能的用户)不受影响。
! L8 W6 c, A- M不要使用union何时union all就足够了。如果知道联合的两个选择之间没有重复项,那就没有必要让DBMS试着删除它们。& t* u2 j8 Q( M6 W3 k
同样,select distinct如需检索所有主键列(或约束中的所有列),请不要在表上使用。没有
1 n1 F# c- N: l# ~7 }2 e- y在这种情况下重复的可能性,所以,再一次,你问的DBMS做不必要的工作。
, U8 m0 w  D( b' q1 x' w3 G5 S# c2 T示例:我们有一个客户select distinct *在一张桌子上使用视图。查询视图需要50秒。当我们用开始视图替换它时,select*,时间降到了亚秒级。不用说,我从中得到了一瓶红酒:-)
1 _1 G' T, C8 N9 p$ A尽量避免select*。换句话说,只获得所需的列。当你在当地时PC上使用MySQL这几乎没有区别,但当加州有一个应用程序查询内蒙古数据库时,你希望减少通过网络发送的流量。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则