240807-最左前缀法则

146 阅读2分钟

最左前缀法则

最左边前缀规则就是:索引的匹配从最左边的字段开始,只有匹配成功才能继续匹配到右边的下一个字段。
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字段从小到大排序。

image.png

所以对于第一个字段name肯定是有序的,而第二个字段age对所有数据就很不是有序的,
假如先过滤了第一个字段name,那么再过来age就是有序的了,后面的字段同理,
所以第一个字段是走索引的必要条件!!!

使用

所以有了联合索引(a,b,c),就可以不用索引a(毕竟索引也占内存和耗费插入数据的时间)。
尽量把常用字段放到联合索引的签名

利用索引排序

参考第二篇文章

select * from table order by a; 不走索引排序
select * from table where a = 1 order by a; 走索引排序

原理:对于第二个sql的执行逻辑:

  1. 先执行where语句,走了索引;
  2. 执行order by语句,先判断上一步是不是用到了索引,假如用到了就直接返回数据,没用到索引的话,在内存进行排序;
  3. 返回排序后的数据。

参考文章

如何优化mysql索引-最左前缀原则案例详解 - 掘金 (juejin.cn) blog.csdn.net/merryxuan/a…