为什么要了解联合索引的最左匹配原则
日常开发中,检索数据的条件通常多于一个;为了提升数据的检索效率,我们通常会建立多个列的联合索引,但是由于不熟悉 MySQL 的最左匹配原则,即使建立了联合索引,但在执行相应的查询操作时 MySQL 却无法用到索引,最终导致新增的索引无法提升 SQL 的检索效率,并且也增加了表维护的开销.
举一个简单的例子
我们在 a
、b
两列上建立了联合索引(a,b)
.
- 通过
where b = 3
检索数据时,MySQL 是无法使用联合索引的 - 通过
a > 1 and b > 2
检索数据,MySQL 仍然无法使用联合索引
所以了解 MySQL 的最左匹配原则非常有必要!
什么是最左匹配原则
1. MySQL 会一直向右匹配直到遇到范围查询【>、<、between、like】就停止匹配
我们仍然通过一个例子分析
比如建立 (a,b,c,d)的顺序索引,检索条件为 a = 1 and b = 2 and c > 3 and d = 4
,此时只有通过a,b
检索数据能够用到索引。
2.其中in
和=
可以乱序
比如建立联合索引 (a,b)
,查询语句为where b = 1 and a = 3
,此时仍然可以用到索引,因为 MySQL 的查询优化器会帮你优化成索引可以识别的形式
那上面的建立 (a,b,c,d)的顺序索引,检索条件为 a = 1 and b = 2 and c > 3 and d = 4
,MySQL 的查询优化器无法优化呢,因为需要遵循联合索引的最左匹配原则
联合索引的最左匹配原则的成因
MySQL创建复合索引的规则首先会对复合索引的最左边的字段的数据进行排序,在第一个字段排序的基础上,再对第二个索引字段进行排序,其实类似实现了order by 字段1,再 order by 字段2 这样一种排序规则,所以呢,第一个字段是绝对有序的,而第二个字段就是无序的了,因此通常情况下, 直接使用第二个字段进行条件判断是用不到索引的,这就是MySQL为什么要强调联合索引最左匹配原则的原因
总结
索引并不是建立的越多越好
1. 数据量小的表不需要建立索引,建立会增加额外的索引开销。
2. 数据变更需要维护索引,因此更多的索引意味着更多的维护成本。
3. 更多的索引意味着也需要更多的空间。
网友评论