最左前缀法则
最左边前缀规则就是:索引的匹配从最左边的字段开始,只有匹配成功才能继续匹配到右边的下一个字段。
like 、> 、< 等操作会使该字段后面的字段索引失效。
简单说:对于联合索引(a,b,c)。
where a = ? | where a = ? and b = ? and c = ? |where a = ? and c = ? 都会走索引
where a = ? and b > 1 会走索引
where b = ? and a = ? 会走索引,mysql执行时会优化顺序
where a > ? and b = ? a走索引,b不走。a走索引是因为b+树是适用于范围查询的
where b = ? | where b = ? and c = ? | where a > 1 都会索引失效
最左前缀法则原理
对于表
CREATE TABLE `students` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL,
`age` int NOT NULL,
`school` varchar(255) NOT NULL,
`address` varchar(255) NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_name_age_school` (`name`,`age`,`school`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
索引结构是这样的:
- 名称字段从小到大排序。
- 当name字段的值相同时,age字段从小到大排序。
- 当age字段的值相同时,school字段从小到大排序。
所以对于第一个字段name肯定是有序的,而第二个字段age对所有数据就很不是有序的,
假如先过滤了第一个字段name,那么再过来age就是有序的了,后面的字段同理,
所以第一个字段是走索引的必要条件!!!
使用
所以有了联合索引(a,b,c),就可以不用索引a(毕竟索引也占内存和耗费插入数据的时间)。
尽量把常用字段放到联合索引的签名
利用索引排序
参考第二篇文章
select * from table order by a; 不走索引排序
select * from table where a = 1 order by a; 走索引排序
原理:对于第二个sql的执行逻辑:
- 先执行where语句,走了索引;
- 执行order by语句,先判断上一步是不是用到了索引,假如用到了就直接返回数据,没用到索引的话,在内存进行排序;
- 返回排序后的数据。
参考文章
如何优化mysql索引-最左前缀原则案例详解 - 掘金 (juejin.cn) blog.csdn.net/merryxuan/a…