一.概要
对于多个字段的查询,通常需要建立联合索引来提高查询效率,比如where a=xx and b=xx and c=xx,那么就可以对a,b,c这三个字段建立联合索引;
联合索引中的排序方式为左边的字段优先排序,在左边字段值相同的情况下右边字段排序,所有联合索引找那个最左边的字段在索引中一定是有序的,右边的字段则不一定
二.最左匹配原则
联合索引中最左边的字段是有序的,右边的字段是在左边字段相同值的情况下是有序性的,所以在遇到范围查询时,右边的字段无法使用到索引
三.索引下推
mysql在5.6引入,在索引遍历过程中,对联合索引中无法使用索引的字段做判断,直接过滤掉不满足条件的记录,减少回表次数,5.6版本之前联合索引中没有命中索引的字段都需要回表查询再进行过滤,如果执行explain现实Extra 为 Using index condition,则使用了索引下推
四.建联合索引策略
1.多个筛选字段组合
a.考虑联合索引失效的情况:在遇到范围查询时,范围查询后面的字段是无法用到联合索引的,所以在建立索引时,比如where a>1 and b=2 and c=3,这种情况就可以建立联合索引(b,c,a)或者(c,b,a)
b.考虑最左匹配原则特性,可以用来减少索引的创建,比如where a=1 and b=2 and c=3和where b=2,这个两个sql中筛选条件都有对b字段的筛选,建立联合索引时就可以考虑建立(b,a,c),这个索引就包括了(b,a)的联合索引和单独对b的索引
c.根据区分度来调整联合索引中的顺序,把区分度高的排前面,这样可以在遍历索引树时减少遍历的节点数,因为重复的数据少
2.查询字段和筛选条件组合
利用覆盖索引的特点,如果查询字段在索引树上,则不用回表查询(回到主键索引树上查询),直接在索引树上取;如果使用到了覆盖索引,通过explain可以看到Extra是using index,这个就表示使用了覆盖索引
3.筛选条件和排序字段组合
对于有排序的sql语句,,如果查询的结果本身是根据排序字段来有序的,则不用再重新排序,进而提升查询的速度,不如where a=1 order by b,则可以建立联合索引(a,b)