我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

面试官: 我看你的简历上写着 精通MySQL,问你个简单的问题, MySQL联合索引有什么特性?

心想,这还不简单,这不是问到我手心里了吗?
听我给你背一遍八股文!

我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

我: MySQL联合索引遵循最左前缀匹配原则,即最左优先,查询的时候会优先匹配最左边的索引。

例如当我们在 (a,b,c)三个字段上创建联合索引时,实际上是创建了三个索引,分别是(a)、(a,b)、(a,b,c)。

当这些索引包含在查询条件中时,查询将使用该索引。例如,索引可以用于以下查询条件:

[En]

When these indexes are included in the query criteria, the query uses the index. For example, an index can be used for the following query criteria:

select * from table_name where a=?;
select * from table_name where a=? and b=?;
select * from table_name where a=? and b=? and c=?;

如果其他查询条件不包含这些索引的查询语句,则不使用索引,例如:

[En]

If other query conditions do not contain query statements for these indexes, indexes are not used, for example:

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联合索引可能有时候不遵循最左前缀匹配原则。

面试官: 什么时候遵循?什么时候不遵循?

我: 可能是晴天遵循,下雨了就不遵循了,每个月那几天不舒服的时候也不遵循了……

面试官: 好吧,今天面试就到这了,你先回去等通知,有后续消息会联系你的。

我擦,这叫什么问题啊?
什么遵循不遵循?
是不是因为面试官和我背了同样的八篇文章?

[En]

Is it because the interviewer and I memorized the same eight-part essay?

我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

回去到MySQL官网上翻了一下,才发现面试官想问的是 索引跳跃扫描(Index Skip Scan)

MySQL8.0版本开始增加了 索引跳跃扫描的功能,当第一列索引的唯一值较少时,即使where条件没有第一列索引,查询的时候也可以用到联合索引。

创建一些数据进行验证,首先创建一个用户表:

[En]

Create some data to verify, first create a user table:

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='一灯';

我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

虽然SQL查询条件只有name字段,但是从执行计划中看到依然是用了联合索引。

并且Extra列中显示增加了 Using index for skip scan,表示用到了 索引跳跃扫描的优化逻辑。

具体的优化方法是在匹配时跳过第一列索引,直接匹配第二列索引的值,这样就可以使用联邦索引。

[En]

The specific optimization method is to skip the first column index when matching, and directly match the value of the second column index, so that the federated index can be used.

其实我们优化一下SQL,把第一列的所有枚举值加到where条件中,也可以用到联合索引:

select * from user where gender in (0,1) and name='一灯';

看来还是需要经常更新自己的知识体系,一不留神就out了!

我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

你觉得呢?

文章持续更新,可以微信搜一搜「 一灯架构 」第一时间阅读更多技术干货。

Original: https://www.cnblogs.com/yidengjiagou/p/16558722.html
Author: 一灯架构
Title: 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505081/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Tomcat配置文件Server.xml解析

    一、Sax的事件驱动模型 类图 基础实现类 DefaultHandler2: 此类扩展了SAX2基本处理程序类,以支持SAX2 LexicalHandler , DeclHandl…

    数据库 2023年6月11日
    0128
  • GROUP BY 后获取每一组最新的一条记录

    最近有一种需求,一张订单可能有多个支付单,这就要求我们拿到每一张订单的最新支付单。具体思路如下: [En] Recently, there is a demand that the…

    数据库 2023年5月24日
    0116
  • Mac上Sublime常用快捷键

    分屏: command + Alt + 2 快速复制当前行代码并插入到下一行: ctrl + shift + d 多行修改一个字段: option + 鼠&a…

    数据库 2023年6月9日
    0146
  • MySQL45讲之IO性能提升

    本文介绍 MySQL 的 binlog 和 redo log 写入机制和刷盘策略,以及如何提升 MySQL 的 IO 性能。 binlog 的写入机制 binlog 的写入流程是:…

    数据库 2023年5月24日
    0125
  • 基础知识,不是很了解的

    Java中方法参数传递方式是按值传递。对于基本类型(int a, long b),参数传递时传递的是值,例如int a = 5,传递的就是5。如果是引用类型,传递是指向具体对象内存…

    数据库 2023年6月14日
    0141
  • 回溯问题学习总结

    回溯问题 三种情况 每种情况都有子集,组合,排列三种题型 无重复元素不可复选 //子集问题 …

    数据库 2023年6月16日
    0131
  • docker-ckeditor图片img标签style属性自适应

    1,修改ckeditor的源码cofig.js文件 // 不给图片img&#x6DF…

    数据库 2023年6月9日
    0154
  • B树-删除

    B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 删除 根据B树的以下两个特性 每一个非叶子结点(除根结点)最少有 ⌈ m/2⌉ 个子结点 有k…

    数据库 2023年6月14日
    0129
  • 并发编程学习

    Semaphore Semaphore 可以允许多个线程访问一个临界区。 应用:实现线程池 CountDownLatch 应用: 业务原始状态:一个线程执行查询订单,查询派送单,对…

    数据库 2023年6月16日
    0143
  • day03-2无异常退出

    多用户即时通讯系统03 4.编码实现02 4.3功能实现-无异常退出系统 4.3.1思路分析 上述代码运行时,在客户端选择退出系统的时候,可以发现程序并没有停止运行,原因是: 退出…

    数据库 2023年6月11日
    0128
  • CMD命令 压缩包与图片完美融合,隐藏文件必备撒

    CMD命令 压缩包与图片完美融合,隐藏文件必备撒 在Windows端,将图片和压缩包完美融合,先将 源文件展示 压缩方案1 copy /b D:\project\IE11完整离线安…

    数据库 2023年6月9日
    0211
  • 栈和队列数据结构

    栈和队列都是常用的数据结构。栈的应用非常的广泛,其原理也是非常经典的。 一、栈 ①栈(stack)又名堆栈,他是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这…

    数据库 2023年6月11日
    0185
  • Mysql_事务_存储过程_触发器

    一、什么是事务? 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库…

    数据库 2023年6月11日
    0147
  • 小姐姐用动画图解Git命令,一看就懂!

    无论是开发、运维,还是测试,大家都知道Git在日常工作中的地位。所以,也是大家的必学、必备技能之一。之前公众号也发过很多git相关的文章: 但是呢,民工哥,也经常在后台看到读者说,…

    数据库 2023年6月9日
    0144
  • gh-ost使用问题记录

    因为 pt-osc 对数据库性能影响较大,且容易造成死锁问题,目前我们在线更改表结构都使用 gh-ost 工具进行修改,这里记录一下使用 gh-ost 过程中的问题,以作记录;首先…

    数据库 2023年6月9日
    0119
  • shutdown 关机与取消关机命令

    Windows 系统自带一个名为Shutdown.exe的程序,可以用于关机操作(位置在Windows\System32下) shutdown -a 取消关机 shutdown -…

    数据库 2023年6月11日
    0151
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球