什么是联合索引?关于联合索引的概念,顾名思义就是关联多个字段组合成为一个索引就是联合索引!
在我们日常开发中SQL查询语句是必不可少的,为了提高查询效率我们引入了索引,那么联合索引你一定听过,本篇文章就带着你了解什么是联合索引,他的优势以及为何要注意索引顺序的理由。
一、联合索引的创建
CREATE INDEX idx_name_age_deptid ON user(`name`,age,deptid)
查看索引信息:
SHOW INDEX FROM user
为什么需要注意联合索引中的顺序?
MySQL使用索引时需要索引有序,假设现在建立了"name,age,deptid"的联合索引,那么索引的排序为: 先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照deptid进行排序。如此字段顺序是尤为重要的,需要注意的是我们可以根据情况,搜索比较频繁的字段建议将该字段放在首位,次之则放在第二位,以此类推。
二、联合索引顺序的影响
联合索引需要坚守最左匹配原则,例如上面介绍的索引的索引为第一个字段进行排序,如果相等则按照第二个字段进行排序,该过程不允许中断。
1. 未使用name
EXPLAIN SELECT * FROM user WHERE age=24 AND deptid = '1';
分析该SQL的索引使用情况发现并未使用到索引:
2. 仅使用name、deptid
EXPLAIN SELECT * FROM user WHERE `name`='王和' AND deptid = '1';
分析该SQL的索引使用情况发现使用到了name,key_len为63,所以从age开始就中断了索引:
3. 使用范围、模糊查询等
EXPLAIN SELECT * FROM user WHERE `name`='王和' AND age > 24 ORDER BY deptid;
分析该SQL的索引使用情况发现name字段使用了函数!=,直接导致索引失效:
三、联合索引的优势
1. 减少索引开销
一个联合索引相当于多个组合索引,在很大程度上为数据库减少了IO操作与磁盘的空间,如:举例中的联合索引相当于name、name+age、name+age+deptid三个索引的建立。
2. 索引全覆盖
如果查询的字段刚好就是该组合索引命中的全部字段则可以理解为组合+覆盖索引,效率很高,因为可以直接从索引遍历中获取索引而不用再去表中扫描获取,从而减少数据库IO操作。
3. 缩小查询范围
联合索引是单值索引效率的N倍,比如:单值索引能查询总数据的10%,则联合索引相当于总数居*N个10%,查询效率明显提升。
总结
以上就是针对联合索引的介绍以及解释为何要保证联合索引使用中的顺序,同时总结了为何联合索引如此重要以及他的优点,在开发中合理的运用索引是一项必不可少的技术。