MySQL调优最直接的方式就是优化索引
在单个列上创建索引相对简单,通常只需要考虑列的分散性,数据越分散,创建出来的索引性能也就更好
复合索引创建的难点在于字段顺序选择
子句 | 原则 |
---|---|
where子句 | 最左前缀匹配原则 |
order by子句 | 文件排序和临时表 |
此外,《阿里巴巴Java开发手册-2020最新嵩山版》中有几个关于复合索引的规约,我们可以看一下:
1.如果有order by的场景,请注意利用索引的有序性。order by后的字段是组合索引的一部分,并且放在组合索引的最后,避免出现filesort的情况,影响查询性能。
如果存在等值查询和排序,则在创建复合索引时,将等值查询字段放在前面,排序放在最后面;
正例:where a=? b=? order by c; 索引a_b_c
反例:索引如果存在范围查询,那么索引有序性将无法使用。如:where a>10 order by b; 索引a_b无法排序。
2.建复合索引的时候,区分度最高的在最左边,如果where a=? and b=?,a列的值几乎接近唯一值,那么只需建单列索引idx_a即可。
说明:存在等号和非等号混合判断条件时,在建索引时,请把等号条件的列前置。如:where c>? and d=?,那么即使c的区分度更高,也必须把d放在索引的最前列,即创建索引idx_d_c。