我说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)

大家都在看

  • Redis-IO模型

    即便是单线程,Redis还是那么快? 一说到Redis的IO模型,就会说到Redis是”单线程”处理的。这里的单线程,主要是指 网络IO和键值读写,也就是处…

    数据库 2023年6月11日
    0111
  • mysql常用操作汇总

    工作中经常用会遇到这种情况,可以访问mysql所在的服务器,但是服务器端口不对外暴露(通常因为安全原因)。这时,操作数据库只能通过命令行和 mysql client窗口来实现。我对…

    数据库 2023年5月24日
    076
  • asp.net(C#)接MYSQL8.0版本报错的处理方法

    由于新的操作系统没有安装mysql,项目中需要使用到,于是安装了最新版本的mysql8.0.28(我安装的是社区版),如果你的项目是老项目,使用的mysql插件是比较老的版本,安装…

    数据库 2023年5月24日
    0190
  • mybatis 拦截器

    1.mybatis拦截器介绍 拦截器可在mybatis进行sql底层处理的时候执行额外的逻辑,最常见的就是分页逻辑、对结果集进行处理过滤敏感信息等。 public Paramete…

    数据库 2023年6月16日
    074
  • MySQL系统变量和字符集

    书名《MySQL是怎样运行的:从根儿上理解MySQL》可自行百度 以下是知识点总结 重新认识Mysql MySQL是一个C/S架构的软件。 在Windows安装后首先注册成服务,然…

    数据库 2023年5月24日
    076
  • MySQL45讲之随机查询和临时表

    本文介绍 MySQL 随机查询的工作流程、优化随机查询的方式、和临时表。 工作流程 根据下表结构建立 words 表,并通过过程插入 10000 条模拟数据。 CREATE TAB…

    数据库 2023年5月24日
    081
  • 分布式事务解决方案

    分布式事务解决方案 花开堪折直须折,莫待无花空折枝。 分布式事务是指事务的操作位于不同的节点上,需要保证事务的ACID特性。在分布式架构下,每个节点只知晓自身操作的成功与失败,无法…

    数据库 2023年6月14日
    088
  • 云数据库技术行业动态@2022-09-30

    重要更新 时序数据库厂商「格睿云Greptime」已于近期完成天使轮融资。据介绍,本轮融资金额在数百万美金级别,由耀途资本领投,九合创投跟投。Greptime成立于2022年4月,…

    数据库 2023年6月11日
    0108
  • springboot~ApplicationContextAware与@Autowired注解

    ApplicationContextAware是一个接口,它提供一个方法setApplicationContext,当spring注册完成之后,会把ApplicationConte…

    数据库 2023年6月6日
    082
  • Spring Boot之WebSocket

    1、项目地址:https://github.com/hqzmss/test01-springboot-websocket.git 2、IDE:IntelliJ IDEA 2018….

    数据库 2023年6月9日
    081
  • 线程简介

    线程简介以多线程在Windows操作系统中的运行模式为例:Windows操作系统是 多任务操作系统,它以进程为 单位。每个独立执行的程序都被称为 进程( 比如正在运行的QQ是一个进…

    数据库 2023年6月16日
    0124
  • Ansible简介

    Ansible 是一种常用的自动运维化工具,基于 python 开发,分布式,无需客户端,轻量级,配置语言采用 YAML。 模块化:调用特定的模块,完成特殊的任务。 2.Param…

    数据库 2023年6月14日
    0114
  • 重新学习数据库(1)

    单元概述 通过本章的学习能够了解MySQL结构查询语言的概念,掌握SELECT查询语句的基本语法,掌握SELECT查询语句中过滤条件的使用,掌握过滤条件中比较运算符和逻辑运算符的使…

    数据库 2023年6月16日
    0196
  • MySQL 数据表操作

    MySQL 数据表操作 数据表操作 每个数据表相当于一个文件,文件分为表结构和表记录。 [En] Each data table is equivalent to a file, …

    数据库 2023年5月24日
    077
  • python-tkinter 自定义tkinter风格的提示框

    博客园的密码终于找回了 前言 偶尔使用python要绘制个简单输入提示框或者复选框窗体,使用tkinter的话绘制窗体也是很麻烦的,想着能不能把它自定义一个简单可复用的提示框。然后…

    数据库 2023年6月11日
    070
  • MYSQL–>SQL语法

    注:DDL(Data definition Language)数据库定义(比如说表,数据库)DML(Data Mainpulation Language)数据库 表的增删改查DQL…

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