1、参数是子查询时,使用EXISTS代替IN
原因:
- 如果链接列(如id)上建立了索引,那么查询时只需要查索引就可以了,而不用查实际的表
- 使用EXISTS只要查询到一行数据满足条件便会终止查询,不用像IN扫描全表
2、UNION ALL性能高于UNION
原因:UNION等集合运算符会自动排序,ALL可不用去重,也就不需要排序
3、使用EXISTS代替DISTINCT
原因:DISTINCT也会排序,除此之外GROUP BY、ORDER BY、聚合函数、集合运算符、窗口函数都会排序
4、尽量不要使用HAVING
原因:如果有GROUP BY,WHERE可以先筛选一遍,并且WHERE可以使用索引,但HAVING是针对聚合后生成的视图进行筛选,很多时候聚合后的视图都没有继承原表的索引结构
5、在GROUP BY子、ORDER BY子句和极值函数的字段使用索引
6、以下几种不会用到索引:
- 在索引字段上进行运算,例如 WHERE col * 1.1>100,可改写为col>100/1.1,条件表达式左侧最好是原始字段而不进行运算
- 使用 IS NULL 谓词,因为索引字段不存在NULL
- 使用否定形式,例如<> != NOT
- 使用OR
- 使用联合索引时,列的顺序错误
- 使用LIKE进行后方一致或中间一致的匹配,只有前方一致匹配可以使用索引
- 进行默认的类型转换,最好使用显示类型转换,例如CAST(10, AS CHAR(2))
7、对聚合结果进行筛选条件时使用HAVING,不需要套一层再做筛选
8、对多个字段使用IN谓词时,将它们汇总到一处
9、先连接再聚合