一般来讲,我们拿到一条“不是很优化”、“烂的”、“慢的” 等 SQL 语句(至于怎么拿到这条语句,不在本篇讨论范围),应该按照以下几个步骤来逐步分析:
一、定位该 SQL 语句涉及到的表结构,确认是磁盘表还是视图,如果是磁盘表,那么该考虑以下几点:
(2)都有主键或者唯一索引,但是没有二级索引。
(4)有主键或者唯一索引,也有一些二级索引,但是这些二级索引可选择性很差。
二、如果有些表是视图,需要考虑以下几点:
三、到了这一步,如果是多张表关联,此处检查表关联键:
四、基于以上几点,表结构分析这块已经大致完毕。接下来从 SQL 语句层面来分析,比如这条 SQL 语句能否修改为更加优化的方式。可以考虑以下两点:
比如这条语句本身是20张表的内联查询,那它不够优化并不是因为写的不好,而是表关联个数实在太多。
复杂 SQL 语句又可以分为很多类别,比如多张子表关联、多张表嵌套子查询、多个子查询合并输出、多个聚合类操作等等。每种都有不同的优化方法,后续我会一一介绍。
五、那么前面几点做完后,进一步分析优化后 SQL 语句的执行计划(如果有条件模拟生产环境压力模型),一般考虑如下几点:
比如日期字段,过滤条件为昨天的查询记录数为100条,过滤条件为前天的查询记录数则变为1W条。
