MySQL联合索引笔记
什么是联合索引?
联合索引指的是在一个表上,多个列加起来组成的一个索引。使用联合索引匹配的时候,首先会匹配第一个,如果匹配成功,会继续匹配第二个,依次类推。
最左前缀原则?
我们要使用联合索引,就必须要遵守最左前缀规则,最左前缀指的是查询的时候会从最左的索引开始匹配。比如现在age和name字段是一个联合索引,现在使用select id,name from user where name = ‘张三’进行查询,因为这条SQL没有对age进行条件查询,而age又是联合索引的第一个。没有满足最左前缀原则,所以这条SQL绝对不会使用联合索引。
实战测试
MySQL版本为5.7
创建一张测试表,插入AA、BB、CC列的联合索引
1 | -- ---------------------------- |
使用6条SQL语句进行测试
1 | EXPLAIN |
我们先执行第一条,使用到了联合索引,命中了联合索引的AA列,索引长度是202
执行第二条SQL,继续加一个BB列的条件,这次又多命中了一个BB的列,长度自然为404
第三条,自然就是606 到这里都没有任何问题
接下来,我们打乱顺序,还是可以命中联合索引,并且全部匹配到了。这是因为MySQL底层的优化器会自动帮助我们排序
这个查询条件有AA和CC 但是最左前缀到BB就断掉了,所以只命中了AA列的索引,长度为202
最后一条,肯定不会走索引,因为第一条都没匹配上
BETWEEN AND对于联合索引的影响
目前共有10条数据
我们来看这条SQL语句 查询出了3条
对应的执行计划,发现命中了联合索引,类型是范围查询
再来看这条SQL,查询出了4条
对应的执行计划
奇怪?,为什么同样的索引,4条数据不走索引,3条就走索引。到网上翻了一些资料,发现和查询出的数据量有关系。这里我总结的是如果查询出的数据量 >= 40% 那么就不会走索引 反之走索引,因为SQL底层优化器认为走全表查询比索引查询的效率快,所以索引就失效了。平时一定要注意这些小细节
总结
- 使用联合索引必须要匹配最左前缀原则
- 查询的条件顺序可以乱序,底层执行器会帮我们自动排序
- 联合索引可以帮助我们减少索引的开销,将原本多个索引和合到了一个上面
- 范围查询要注意查询出的结果量