mysql索引使用规则:最左前缀法则

  • 时间:2025-11-11 19:05 作者: 来源: 阅读:0
  • 扫一扫,手机访问
摘要:如果索引引用了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始, 并且不跳过索引中的列。如果跳跃某一列,索引将会部分失效(后面的字段索引失效)。现有一张用户表tb_user,具体结构如下:CREATE TABLE `tb_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `na

如果索引引用了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始, 并且不跳过索引中的列。如果跳跃某一列,索引将会部分失效(后面的字段索引失效)。

现有一张用户表tb_user,具体结构如下:

CREATE TABLE `tb_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(50) NOT NULL COMMENT '用户名',
  `phone` varchar(11) NOT NULL COMMENT '手机号',
  `email` varchar(100) DEFAULT NULL COMMENT '邮箱',
  `profession` varchar(11) DEFAULT NULL COMMENT '专业',
  `age` tinyint(3) unsigned DEFAULT NULL COMMENT '年龄',
  `gender` char(1) DEFAULT NULL COMMENT '性别 , 1: 男, 2: 女',
  `status` char(1) DEFAULT NULL COMMENT '状态',
  `createtime` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

mysql索引使用规则:最左前缀法则

tb_user表数据

1、在 tb_user 表中,我们创建一个联合索引,这个联合索引涉及到三个字段,顺序分别为:profession(专业), age(年龄),status(状态)。

create   index   index_user_pro_age_sta  on  tb_user(profession,age,status) ;

2、查看tb_user表的全部索引

show  index  from  tb_user;

mysql索引使用规则:最左前缀法则

tb_user表索引

3、对于最左前缀法则指的是,查询时,最左变的列,也就是profession必须存在,否则索引全部失效。 而且中间不能跳过某一列,否则该列后面的字段索引将失效。 接下来,我们来演示几组案例,看一下 具体的执行计划:

explain select * from tb_user where profession = '软件工程' and age = 31 and status = '0';

mysql索引使用规则:最左前缀法则

explain select * from tb_user where profession = '软件工程' and age = 31

mysql索引使用规则:最左前缀法则

explain select * from tb_user where profession = '软件工程';

mysql索引使用规则:最左前缀法则

以上的这三组测试中,我们发现只要联合索引最左边的字段 profession存在,索引就会生效,只不 过索引的长度不同。 而且由以上三组测试,我们也可以推测出profession字段索引长度为36、age 字段索引长度为2、status字段索引长度为4。


以下两条sql索引会生效吗?

explain select * from tb_user where age = 31 and status = '0';

mysql索引使用规则:最左前缀法则

explain select * from tb_user where status = '0';

mysql索引使用规则:最左前缀法则

而通过上面的这两组测试,我们也可以看到索引并未生效,缘由是由于不满足最左前缀法则,联合索引 最左边的列profession不存在。


explain select * from tb_user where profession = '软件工程' and status = '0';

mysql索引使用规则:最左前缀法则

上述的SQL查询时,存在profession字段,最左边的列是存在的,索引满足最左前缀法则的基本条 件。但是查询时,跳过了age这个列,所后来面的列索引是不会使用的,也就是索引部分生效,所以索 引的长度就是36。


当执行SQL语句: explain select * from tb_user where age = 31 and status = '0' and profession = '软件工程'; 时,是否满足最左前缀法则,走不走 上述的联合索引,索引长度?

mysql索引使用规则:最左前缀法则

可以看到,是完全满足最左前缀法则的,索引长度42,联合索引是生效的。 注意 : 最左前缀法则中指的最左边的列,是指在查询时,联合索引的最左边的字段(即是 第一个字段)必须存在,与我们编写SQL时,条件编写的先后顺序无关。

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】最低 2 美元,这 55 款 macOS & Windows 应用一次全都入手(2025-11-11 22:01)
【系统环境|】SCI期刊对论文图片有哪些要求?(2025-11-11 22:00)
【系统环境|】论文缩写大全,拿走不谢(2025-11-11 22:00)
【系统环境|】阿甘正传高频词整理 GRE托福四六级词汇整理(2025-11-11 21:59)
【系统环境|】矢量图形编辑应用程序-WinFIG(2025-11-11 21:59)
【系统环境|】Figma上市首日暴涨250%的深层逻辑:为什么AI时代协作平台更加不可替代?(2025-11-11 21:58)
【系统环境|】FigJam是什么?一文读懂在线白板软件的方方面面!(2025-11-11 21:58)
【系统环境|】在windows上有什么好用的书写白板软件?(2025-11-11 21:57)
【系统环境|】Docker基础应用之nginx(2025-11-11 21:57)
【系统环境|】VS Code 新手必装插件清单(2025-11-11 21:56)
手机二维码手机访问领取大礼包
返回顶部