mysql 索引易混淆概念
本文针对mysql innodb引擎情况下,索引的一些易混淆概念整合
1.覆盖索引:查询的字段已经在查询条件的索引树上,这样在查询的时候就不用回表,可以少查询一颗b+树,常作为索引的优化手段之一,通常我们都会根据查询条件字段和查询字段建立联合索引来实现覆盖索引
2.最左前缀原则:在联合索引(a,b,c)中,也包含了a索引,不用单独给联合索引左边的字段建立索引,最左匹配原则,在遇到范围查询(如 >、<)的时候,就会停止匹配,也就是范围查询的字段可以用到联合索引,但是在范围查询字段的后面的字段无法用到联合索引。注意,对于 >=、<=、BETWEEN、like 前缀匹配的范围查询,并不会停止匹配,可以通过执行explain后的key_len判断联合索引中命中的索引字段
3.联合索引:联合索引就是多字段联合组成的索引,是上面1的基础,联合索引里的字段遵循的排序规则是优先满足左边字段排序的情况下,再对右边字段排序,所以通常情况下右边的字段可能是无序的,联合索引具有最左前缀原则
详细:https://www.cnblogs.com/rjzheng/p/12557314.html,https://xiaolincoding.com/mysql/index/index_interview.html#%E6%8C%89%E5%AD%97%E6%AE%B5%E4%B8%AA%E6%95%B0%E5%88%86%E7%B1%BB
4.索引下推:mysql在5.6引入,在索引遍历过程中,对联合索引中无法使用索引的字段做判断,直接过滤掉不满足条件的记录,减少回表次数,5.6版本之前联合索引中没有命中索引的字段都需要回表查询再进行过滤,如果执行explain现实Extra 为 Using index condition,则使用了索引下推
总结:联合索引对sql的优化可以起到很大的作用,多条件查询时可以提升查询性能,利用覆盖索引可以减少回表查询的时间,提升查询性能,利用最左前缀原则可以减少建立索引带来的开销,如果有排序的情况,还可以根据筛选字段和排序字段建立联合索引来保证提取数据时本身有序,来避免查询执行排序算法,进而提升查询sql性能