写点什么

SQL 性能优化的几条建议

用户头像
U+2647
关注
发布于: 2021 年 04 月 14 日

1. 避免使用外键

使用外键时会使锁升级,并行度下降。例如,不使用外键的时候,只需要锁一张表,当使用外键后,需要锁两张表。

2. 将 DISTINCT 值较高的字段设置为索引

DISTINCT 值是指去重后的数量,这个数量越大,说明字段的值重复率越低,索引效果就越好。

3. 将表关联时被关联的字段设置为索引

将被关联的字段设置为索引,可以提高关联表的效率

4. 调整复合索引的字段顺序

  • 将 DISTINCT 值较高的字段设置为前导字段。

  • 如果 DISTINCT 值相近,将频繁查询的字段往前调。

  • 如果查询频率相近,将排序字段往前调。


避免出现 索引跳跃式扫描(index skip sacn)


例如:我们有一张订单表,我们对订单号、订单状态做了复合索引。但是,索引创建的时候是订单状态列在前,订单号在后。如果我们要根据一个订单号查询时,Oracle 会先在状态 A 中的订单里查该订单,然后在状态 B 中查该订单,以此类推,当在所有的状态中查询结束后合并结果,就是最终的结果,这种情况就是 索引跳跃式扫描。

5. 索引字段尽量避免 NULL 值

  • 在 Oracle 中索引里含有 NULL 值会导致索引失效

  • 在 MySQL 中索引里含有 NULL 会导致额外的存储开销

6. 尽量避免大事务,超出 UNDO 表空间

UNDO 表空间:在执行事务时,会将参与事务的数据备份到 UNDO 表空间,解决读一致问题。


如果事务操作的数据量过大,会可能撑爆 UNDO 表空间

7. SELECT、INSERT 语句要写清楚列名

如果不写清楚列名,数据库会先查询一次列名。影响 SQL 的执行时间

8. 用 EXISTS 代替 IN

IN 是把外表和内表作 hash join,而 EXISTS 是对外表做 loop,每次 loop 再对内表进行查询。

9. LIKE 使用前端匹配

使用 LIKE '%xxx',尽量避免使用 LIKE '%xxx%',这种会导致索引失效

10. 尽可能用 UNION ALL 代替 UNION

UNION 会对结果进行去重,影响查询效率

11. 左外连接时,尽可能限制左表的数据量

左表的数据量越小,查询结果就越小。


尽量避免笛卡尔积的情况出现

发布于: 2021 年 04 月 14 日阅读数: 15
用户头像

U+2647

关注

evolving code monkey 2018.11.05 加入

https://zdran.com/

评论

发布
暂无评论
SQL 性能优化的几条建议