MySQL数据库笔记——最左前缀原则原理及其注意事项

大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍MySQL索引的关键潜规则——最左前缀原则。

在这里插入图片描述

文章目录

      • 图示单值索引和联合索引
        • 单值索引
        • 联合索引
      • 最左前缀原则
      • 示例分析
        • 1. 全值匹配查询时
        • 2. 匹配左边的列时
        • 3. 匹配列前缀(%)
        • 4. 匹配范围值
        • 5. 精确匹配某一列并范围匹配另外一列
        • 6. 排序
      • 总结
    • 历史文章

图示单值索引和联合索引

单值索引
  • 单值索引(唯一索引、主键索引、全文索引等) 是指在数据库表中创建的、仅涉及单个列的索引。也就是说,单值索引是基于表中的单一列(例如,单个字段)创建的索引结构。单值索引底层的 B+ 树如下所示:
    在这里插入图片描述
联合索引
  • 与单值索引只在一个列上建立,联合索引建在多个列上的索引,通常用于优化多列查询。当查询条件中涉及多个列时,数据库引擎会使用最适合的索引来提高查询效率。
  • 联合索引的列顺序非常重要,通常是根据查询中最常用的过滤列进行排序。

联合索引的结构依旧是一颗 B+ 树,只不过联合索引的键值数量不是一个,而是多个,如下图所示:
在这里插入图片描述

当索引为联合索引时,数据库会依据联合索引最左的字段来构建 B+ 树,也叫 最左前缀匹配原则

在上图中,我们假如创建一个 (a, b) 的联合索引,其中,a, b 排序分析为:

  • a顺序:1,1,2,2,3,3
  • b顺序:1,2,1,4,1,2

可以发现:

  • a字段是有序排列b字段是无序排列(因为 B+ 树只能选一个字段来构建有序的树)。
  • 但在 a 相等的情况下,b 字段是有序的

这符合我们的编程习惯,在平时的编程中,我们常常需要对两个字段进行排序:

  • 首先按照第一个字段排序。
  • 如果第一个字段相等,则用第二个字段排序。

这种排序思想同样被用到了 B+ 树中。

最左前缀原则

  • 最左优先:以最左边的字段为起点,任何连续的索引都能匹配上。
  • 范围查询字段后停止:例如遇到 ><BETWEENLIKE之后,下一个列就不会再使用索引进行匹配。

下面将通过一些例子,来讲清楚最左前缀原则应该遵守的规则。

示例分析

我们创建联合索引 (a, b, c)

  • CREATE INDEX idx_abc ON table_name (a, b, c);
1. 全值匹配查询时

例如:

  • select * from table_name where a = '1' and b = '2' and c = '3'
  • select * from table_name where b = '2' and a = '1' and c = '3'
  • select * from table_name where c = '3' and b = '2' and a = '1'

这些查询都能用到索引,因为查询条件顺序调换不影响查询结果,因为 MySQL 中有查询优化器,会自动优化查询顺序

2. 匹配左边的列时

例如:

  • select * from table_name where a = '1'
  • select * from table_name where a = '1' and b = '2'
  • select * from table_name where a = '1' and b = '2' and c = '3'

这些查询都从最左边开始连续匹配,用到了索引。

但如果查询条件没有从最左边开始,则不会使用联合索引查询会转为全表扫描

  • select * from table_name where b = '2'
  • select * from table_name where c = '3'
  • select * from table_name where b = '1' and c = '3'

这些没有从最左边开始,最后查询没有用到索引,用的是全表扫描。

  • select * from table_name where a = 1 and c = 3

部分索引,只有 a 列用到了索引,c 列无法使用索引。

3. 匹配列前缀(%)

对于字符型字段的匹配:

  • 如果查询条件是前缀匹配(例如 a like 'As%'),可以使用索引,因为前缀是有序的。
  • 如果查询条件是后缀或中缀匹配(例如 a like '%As'a like '%As%'),则不能使用索引,需要全表扫描。

例子:

  • select * from table_name where a like 'As%'(前缀匹配,走索引查询)
  • select * from table_name where a like '%As'(全表查询)
  • select * from table_name where a like '%As%'(全表查询)
4. 匹配范围值

例如:

  • select * from table_name where a > 1 and a < 3:一个列进行范围查询,前缀匹配,走索引查询。
  • select * from table_name where a > 1 and a < 3 and b > 1:多个列同时进行范围查找时。
    • 只有对索引最左边的列进行范围查找才用到 B+ 树索引。因此,只有 a 列用到了索引,b 列无法使用索引,查询会基于 1 < a < 3 的范围查找记录后,继续逐条过滤。
5. 精确匹配某一列并范围匹配另外一列

如果左边的列是精确查找,右边的列可以进行范围查找。例如:

  • select * from table_name where a = 1 and b > 3

在这种查询中,a = 1 的情况下,b 字段是有序的,可以进行范围查找,联合索引会加速查询。

6. 排序

order by的子句后面的顺序也必须按照索引列的顺序给出,比如:

  • select * from table_name order by a,b,c limit 10使用索引。因为 B+ 树索引本身就是按照顺序排序的,所以可以直接从索引中提取数据,然后进行回表操作取出该索引中不包含的列。

  • select * from table_name order by b,c,a limit 10:这种查询没有按照索引列的顺序进行排序,所以无法使用索引

  • select * from table_name order by a limit 10select * from table_name order by a,b limit 10;:只用到了部分索引

  • select * from table_name where a = 1 order by b,c limit 10: 会使用联合索引。联合索引左边列为常量,后面的列排序可以用到索引。


总结

  • 联合索引 是通过多列的值来构建 B+ 树,而数据库通过 最左匹配原则 来利用这些索引。
  • 查询时要注意查询条件的顺序和是否符合最左匹配原则,以便有效利用索引。
  • 对于范围查询,只有最左侧的字段可以进行范围查询,后续字段则会失去索引效用。

历史文章

  1. MySQL数据库笔记——数据库三范式
  2. MySQL数据库笔记——存储引擎(InnoDB、MyISAM、MEMORY、ARCHIVE)
  3. MySQL数据库笔记——常见的几种锁分类
  4. MySQL数据库笔记——索引介绍
  5. MySQL数据库笔记——事务介绍
  6. MySQL数据库笔记——索引结构之B+树
  7. MySQL数据库笔记——索引潜规则(回表查询、索引覆盖、索引下推)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/959547.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java数据结构 (链表反转(LinkedList----Leetcode206))

1. 链表的当前结构 每个方框代表一个节点&#xff0c;每个节点包含两个部分&#xff1a; 左侧的数字&#xff1a;节点存储的值&#xff0c;例如 45、34 等。右侧的地址&#xff08;如 0x90&#xff09;&#xff1a;表示该节点 next 指针指向的下一个节点的内存地址。 例子中&a…

IMX6ull项目环境配置

文件解压缩&#xff1a; .tar.gz 格式解压为 tar -zxvf .tar.bz2 格式解压为 tar -jxvf 2.4版本后的U-boot.bin移植进SD卡后&#xff0c;通过串口启动配置开发板和虚拟机网络。 setenv ipaddr 192.168.2.230 setenv ethaddr 00:04:9f:…

git基础指令大全

版本控制 git管理文件夹 进入要管理的文件夹 — 进入 初始化&#xff08;提名&#xff09; git init 管理文件夹 生成版本 .git ---- git在管理文件夹时&#xff0c;版本控制的信息 生成版本 git status 检测当前文件夹下的文件状态 (检测&#xff0c;检测之后就要管理了…

[高等数学学习记录]函数的极值与最大值最小值

1 知识点 1.1 函数的极值及其求法 定义 设函数 f ( x ) f(x) f(x) 在点 x 0 x_0 x0​ 的某邻域 U ˚ ( x 0 ) \mathring{U}(x_0) U˚(x0​) 内有定义&#xff0c;如果对于去心邻域 U ˚ ( x 0 ) \mathring{U}(x_0) U˚(x0​) 内的任一 x x x&#xff0c;有 f ( x ) <…

docker 简要笔记

文章目录 一、前提内容1、docker 环境准备2、docker-compose 环境准备3、流程说明 二、打包 docker 镜像1、基础镜像2、国内镜像源3、基础的dockerfile4、打包镜像 四、构建运行1、docker 部分2、docker-compose 部分2.1、构建docker-compose.yml2.1.1、同目录构建2.1.2、利用镜…

JVM常见知识点

在《深入理解Java虚拟机》一书中&#xff0c;介绍了JVM的相关特性。 1、JVM的内存区域划分 在真实的操作系统中&#xff0c;对于地址空间进行了分区域的设计&#xff0c;由于JVM是仿照真实的机器进行设计的&#xff0c;那么也进行了分区域的设计。核心区域有四个&#xff0c;…

电脑系统bcd文件损坏修复方法:小白也会的修复方法

电脑系统bcd文件损坏怎么办?当电脑开机时出现bcd文件损坏&#xff0c;一般情况是由于电脑系统的引导坏了&#xff0c;需要进行修复。现在越来越多的小伙伴遇到电脑引导丢失或者安装后无法正常引导的问题&#xff0c;我们现在一般是pe下进行修复引导&#xff0c;那么电脑系统bc…

Flutter_学习记录_导航和其他

Flutter 的导航页面跳转&#xff0c;是通过组件Navigator 和 组件MaterialPageRoute来实现的&#xff0c;Navigator提供了很多个方法&#xff0c;但是目前&#xff0c;我只记录我学习过程中接触到的方法&#xff1a; Navigator.push(), 跳转下一个页面Navigator.pop(), 返回上一…

【架构面试】二、消息队列和MySQL和Redis

MQ MQ消息中间件 问题引出与MQ作用 常见面试问题&#xff1a;面试官常针对项目中使用MQ技术的候选人提问&#xff0c;如如何确保消息不丢失&#xff0c;该问题可考察候选人技术能力。MQ应用场景及作用&#xff1a;以京东系统下单扣减京豆为例&#xff0c;MQ用于交易服和京豆服…

Git 如何将旧仓库迁移新仓库中,但不显示旧的提交记录

一、异常错误 场景&#xff1a;我想把旧仓库迁移新仓库中&#xff0c;放进去之后&#xff0c;新仓库会显示这个项目之前的所有提交&#xff0c;如何不显示这些旧的提交&#xff1f; 二、原因 我们需要将旧仓库迁移新仓库中&#xff0c;但是又不想在新仓库中显示旧的提交记录…

02-AD-绘制原理图(画示意图+添加已有P封装)

画示意图添加已有P封装 画原理示意图绘制原理图:电容绘制原理图:晶体绘制发光二极管绘制TVS二极管绘制按键绘制拨码开关绘制双排针绘制单排针绘制TYPE母座画图技巧:按顺序递增,删除不用的先画线,再画框 绘制AMS芯片填充框透明显示:防止遮挡其他部分不需要添加其他内容 绘制STM3…

C++红黑树详解

文章目录 红黑树概念规则为什么最长路径不超过最短路径的二倍&#xff1f;红黑树的时间复杂度红黑树的结构插入叔叔节点情况的讨论只变色(叔叔存在且为红)抽象的情况变色单旋&#xff08;叔叔不存在或叔叔存在且为黑&#xff09;变色双旋&#xff08;叔叔不存在或叔叔存在且为黑…

LLaMA-Factory 微调LLaMA3

LLaMA-Factory 框架 首先需要通过vscode连接远程服务器哦 如果是租赁的AutoDL服务器&#xff0c;一定要将模型下载到数据盘。 git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e . 准备训练数据 训练数据&#xff1a; fintech.json …

FFmpeg 头文件完美翻译之 libavcodec 模块

前言 众所周知&#xff0c;FFmpeg 的代码开发上手难度较高&#xff0c;源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发&#xff0c;需要借助它的头文件&#xff0c;FFmpeg 把很多代码库教程都写在头文件里面。因此&#xff0c;熟读头文件的内…

IDEA工具下载、配置和Tomcat配置

1. IDEA工具下载、配置 1.1. IDEA工具下载 1.1.1. 下载方式一 官方地址下载 1.1.2. 下载方式二 官方地址下载&#xff1a;https://www.jetbrains.com/idea/ 1.1.3. 注册账户 官网地址&#xff1a;https://account.jetbrains.com/login 1.1.4. JetBrains官方账号注册…

AMQP是什么

文章目录 AMQP是什么一、引言二、AMQP的核心概念1、协议定义2、消息传递模型 三、AMQP的工作原理1、消息路由机制2、消息确认机制 四、使用示例1、Java代码示例1.1、项目依赖1.2、配置文件1.3、消息配置1.4、消息生产者1.5、消息消费者 五、总结 AMQP是什么 一、引言 在现代分…

ESP32基于ESPIDF I2C设备探测和使用

ESP32基于ESPIDF I2C设备探测和使用 &#x1f4cd;I2C接口介绍和参考&#xff1a;https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-reference/peripherals/i2c.html &#x1f4d3;I2C 主机探测 主要主要利用 i2c_master_probe() 函数&#xff0c;来检测…

计算机网络 (58)无线局域网WLAN

前言 无线局域网WLAN&#xff08;Wireless Local Area Network&#xff09;是一种利用无线通信技术将计算机设备互联起来&#xff0c;构成可以互相通信和实现资源共享的网络体系。 一、定义与特点 定义&#xff1a; WLAN通过无线信道代替有线传输介质连接两个或多个设备形成一个…

物业管理平台系统提升社区智能化服务效率与管理水平

内容概要 在现代社会中&#xff0c;物业管理平台系统的出现&#xff0c;为社区的智能化服务带来了革命性的变化。这种系统不仅仅是提升了工作效率&#xff0c;更是通过一系列智能化功能&#xff0c;根本性改变了物业管理的方式。比如&#xff0c;在广告位管理方面&#xff0c;…

基于SpringBoot的网上考试系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…