我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知
面试官: 我看你的简历上写着精通MySQL,问你个简单的问题,MySQL联合索引有什么特性?
心想,这还不简单,这不是问到我手心里了吗?
听我给你背一遍八股文!

我: MySQL联合索引遵循最左前缀匹配原则,即最左优先,查询的时候会优先匹配最左边的索引。
例如当我们在(a,b,c)三个字段上创建联合索引时,实际上是创建了三个索引,分别是(a)、(a,b)、(a,b,c)。
查询条件中包含这些索引的时候,查询就会用到索引。例如下面的查询条件,就可以用到索引:
select * from table_name where a=?;
select * from table_name where a=? and b=?;
select * from table_name where a=? and b=? and c=?;
其他查询条件不包含这些索引的查询语句,就不会用到索引,例如:
select * from table_name where b=?;
select * from table_name where c=?;
select * from table_name where b=? and c=?;
如果查询条件包含(a,c),也会用到索引,相当于用到了(a)索引。
面试官: 小伙子,你的八股文背的挺熟啊。
我: 也没有辣,我只是平常热爱学习知识,经常做一些总结汇总,所以就脱口而出了。
面试官: 别开染坊了,我再问你,MySQL联合索引一定遵循最左前缀匹配原则吗?
我擦,这把我问的不自信了。
我: 嗯……,MySQL联合索引可能有时候不遵循最左前缀匹配原则。
面试官: 什么时候遵循?什么时候不遵循?
我: 可能是晴天遵循,下雨了就不遵循了,每个月那几天不舒服的时候也不遵循了……
面试官: 好吧,今天面试就到这了,你先回去等通知,有后续消息会联系你的。
我擦,这叫什么问题啊?
什么遵循不遵循?
难道是面试官跟我背的八股文不是同一套?

回去到MySQL官网上翻了一下,才发现面试官想问的是索引跳跃扫描(Index Skip Scan)。
MySQL8.0版本开始增加了索引跳跃扫描的功能,当第一列索引的唯一值较少时,即使where条件没有第一列索引,查询的时候也可以用到联合索引。
造点数据验证一下,先创建一张用户表:
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(255) NOT NULL COMMENT '姓名',
`gender` tinyint NOT NULL COMMENT '性别',
PRIMARY KEY (`id`),
KEY `idx_gender_name` (`gender`,`name`)
) ENGINE=InnoDB COMMENT='用户表';
在性别和姓名两个字段上(gender,name)建立联合索引,性别字段只有两个枚举值。
执行SQL查询验证一下:
explain select * from user where name='一灯';

虽然SQL查询条件只有name字段,但是从执行计划中看到依然是用了联合索引。
并且Extra列中显示增加了Using index for skip scan,表示用到了索引跳跃扫描的优化逻辑。
具体优化方式,就是匹配的时候遇到第一列索引就跳过,直接匹配第二列索引的值,这样就可以用到联合索引了。
其实我们优化一下SQL,把第一列的所有枚举值加到where条件中,也可以用到联合索引:
select * from user where gender in (0,1) and name='一灯';
看来还是需要经常更新自己的知识体系,一不留神就out了!

你觉得呢?
文章持续更新,可以微信搜一搜「 一灯架构 」第一时间阅读更多技术干货。
我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知的更多相关文章
- Mysql联合索引的最左前缀原则以及b+tree
软件版本mysql5.7 根据官网的文档 https://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html 查询条件要符合最左原 ...
- 关于MySQL索引的最左前缀匹配原则原理说明说明
假设有2个这样的SQL SELECT * FROM table WHERE a = 1 AND c = 3; // c不走索引 SELECT * FROM table WHERE a = 1 AND ...
- 三道MySQL联合索引面试题,淘汰80%的面试者,你能答对几道
众所周知MySQL联合索引遵循最左前缀匹配原则,在少数情况下也会不遵循(有兴趣,可以翻一下上篇文章). 创建联合索引的时候,建议优先把区分度高的字段放在第一列. 至于怎么统计区分度,可以按照下面这种方 ...
- mysql 最左前缀匹配原则
1.在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,示例:对列col1.列col2和列col3建一个联合索引 KEY index_col1_co ...
- MySQL 的索引和最左前缀原则
这两天看<构建高性能Web站点>这本书,感觉写的真是不错,很多实际项目中会碰到的问题都有所提及,今天看到一个最左前缀原则,以前也听说过,不过一直没搞明白,今天查了下. 通过实例理解单列索引 ...
- MySQL的索引类型和左前缀索引
1.索引类型: 1.1B-tree索引: 注:名叫btree索引,大的方面看,都用的是平衡树,但具体的实现上,各引擎稍有不同,比如,严格的说,NDB引擎,使用的是T-tree,但是在MyISAM,In ...
- MySQL联合索引运用-最左匹配原则
前言 之前看了很多关于MySQL索引的文章也看了<高性能MySQL>这本书,自以为熟悉了MySQL索引使用原理,入职面试时和面试官交流,发现对复合索引的使用有些理解偏颇,发现自己的不足整理 ...
- MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序
MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序 What's Index ? 索引就是帮助RDBMS高效获取数据的数据结构. 索引可以让我们避免一行一行进行全表扫描.它的 ...
- MySQL 联合索引详解
MySQL 联合索引详解 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c ...
随机推荐
- VB.net使用Microsoft.Office.Interop.Excel对Excel进行简单的读取和写入
环境:Visual Stadio 2017 .NET Framework 4.6.1 1.直接进入正题,新建一个控制台程序,右键引用-管理Nuget程序包,搜索Microsoft.Office.In ...
- 【JNPF修改通告】fastjson≤1.2.80反序列化漏洞
近日Fastjson Develop Team 发现 fastjson 1.2.80及以下存在新的风险,存在反序列化漏洞.攻击者可绕过默认autoType关闭限制,攻击远程服务器,风险影响较大,请大家 ...
- mac上使用Vmware Fusion虚拟机配置Centos的静态ip
一.背景 本文简单记录一下,在mac arm 架构下使用 Vmware Fusion虚拟机下Centos7下如何配置静态ip地址.如果使用dhcp静态ip地址的动态分配,那么可能ip地址会发生变化,因 ...
- 重学ES系列之变量的作用范围
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 关于各种Vue UI框架中加载进度条的正确使用
这里拿MUSE UI 中的进度条举例 <mu-circular-progress :size="40" class="icon" v-if="i ...
- Vue几行代码实现搜索功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Array 数组filter()方法,遍历数组返回符合条件的一个新数组
<script> const arr = [ { id: 1, name: "aa", isDone: false }, { id: 2, name: "bb ...
- 【python基础】第03回 软件安装
上节内容回顾 1.计算机五大组成部分详解 1.控制器 控制计算机各个硬件的工作 2.运算器 数学运算.逻辑运算(核心) """CPU = 控制器 + 运算器"& ...
- 论文解读(GCC)《Efficient Graph Convolution for Joint Node RepresentationLearning and Clustering》
论文信息 论文标题:Efficient Graph Convolution for Joint Node RepresentationLearning and Clustering论文作者:Chaki ...
- 手写网站服务器~用Python手动实现一个简单的服务器,不借助任何框架在浏览器中输出任意内容
写在前面的一些P话: 在公司网站开发中,我们往往借助于Flask.Django等网站开发框架去提高网站开发效率.那么在面试后端开发工程师的时候,面试官可能就会问到网站开发的底层原理是什么? 我们不止仅 ...