【MySQL】最左前缀匹配原则

news2024/9/22 17:18:20

 

目录

准备库表

结果集在索引列中的查询

1. explain select a,b,c from t where a=1;

2. explain select a,b,c from t where a=1 AND b=2;

3. explain select a,b,c from t where a=1 order by b;

4. explain select a,b,c from t where a=1 order by d;

5. explain select a,b,c from t where b=1;

结果集不在索引列中的查询

1. explain select a,b,c,d from t where a=1;

2. explain select a,b,c,d from t where a=1 AND b=2;

3. explain select a,b,c,d from t where a=1 order by b; 

4. explain select a,b,c,d from t where a=1 order by d;

5. explain select a,b,c,d from t where b=1;

总结


MySQL 版本:8.0.32

通过实战的方式加深对最左前缀匹配原则的理解

准备库表

CREATE TABLE `t` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `a` int NOT NULL DEFAULT '0',
  `b` int NOT NULL DEFAULT '0',
  `c` int NOT NULL DEFAULT '0',
  `d` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `key_a_b_c` (`a`,`b`,`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

建立联合索引(a,b,c)

结果集在索引列中的查询

1. explain select a,b,c from t where a=1;

type: ref 表示走普通索引,结果可能有多行

key_len: 4 表示只用到联合索引(a,b,c)的最左前缀 a

Extra: Using index 表示走覆盖索引,不用回表

2. explain select a,b,c from t where a=1 AND b=2;

和 1 差不多,只不过 key_len 是 8,表示用到联合索引(a,b,c)的两个最左前缀 a,b

3. explain select a,b,c from t where a=1 order by b;

和 1 完全相同,因为建立联合索引(a,b,c)后,找到 a 对应的索引列,那么 b 本身就是有序的

4. explain select a,b,c from t where a=1 order by d;

因为使用了索引列之外的列进行排序,所以走了 Using filesort 外部排序

order by 的排序原理是 MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer,这里会按照 a 索引列匹配,因为 d 在主键索引中,所以回表查出整行,存入 sort_buffer 中,最后对 sort_buffer 中的数据按照字段 d 做快速排序,而排序这个动作可能在内存中完成,也可能需要使用外部排序,因此可能会有性能问题

5. explain select a,b,c from t where b=1;

type: index,因为最左前缀匹配原则,没有命中索引,但因为查询的列都在联合索引列中,走了索引扫描

Extra: Using where; Using index 表示条件过滤,且走了覆盖索引

结果集不在索引列中的查询

1. explain select a,b,c,d from t where a=1;

和只查 a,b,c 唯一的区别是 Extra 列为空,因为查 d 需要回表

2. explain select a,b,c,d from t where a=1 AND b=2;

和只查 a,b,c 唯一的区别是 Extra 列为空,因为查 d 需要回表

3. explain select a,b,c,d from t where a=1 order by b; 

和只查 a,b,c 唯一的区别是 Extra 列为空,因为查 d 需要回表

4. explain select a,b,c,d from t where a=1 order by d;

和只查 a,b,c 完全相同,因为排序字段也会放在 sort_buffer 中

5. explain select a,b,c,d from t where b=1;

type:ALL,因为 d 不在索引列中,索引失效,直接走了全表扫描

Extra:Using Where,按条件过滤

总结

对于结果集在和不在索引列的两种情况,虽然都不符合最左前缀原则,执行计划还是有很大区别的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

css 数字平铺布局

效果图 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>活动中心</title><meta name"viewport" content"maximum-scale1.0,minimum-scale1.0,user-scalable0,widthdevice-width,initial-scale1.0…

团队Bug管理:7个顶级工具帮手

本文将分享2024年值得关注的7款Bug管理工具&#xff1a;PingCode、Worktile、Tower、禅道、Coding、Bugzilla、Jira。 在面对日益复杂的软件开发项目时&#xff0c;管理Bug成为了一个让许多团队头疼的问题。选择一个合适的Bug管理工具不仅可以提高团队的效率&#xff0c;还能显…

Apache IoTDB 论文入选数据库国际顶会 ICDE 2024

近日&#xff0c;Apache IoTDB 的研究成果论文&#xff1a;On Tuning Raft for IoT Workload in Apache IoTDB&#xff08;《在 Apache IoTDB 中针对物联网工作负载调整 Raft 共识协议》&#xff09;被数据库领域国际顶级学术会议 The 40th IEEE International Conference on D…

Netty 必知必会(六)—— 粘包拆包问题

tcp粘包、半包怎么解决的&#xff08;LineBased和LengthBased,我是用的是LineBased&#xff09;为什么要使用LineBased&#xff0c;怎么分割的&#xff08;/r/n&#xff0c;当时没有考虑太多&#xff0c;觉得这个比较简单&#xff09;Netty解决粘包的几种方式Netty 拆包粘包的实…

SD-WAN组网加速ZOOM视频会议

随着远程办公和在线教育的普及&#xff0c;视频会议已成为人们日常沟通的重要工具。然而&#xff0c;网络不稳定、延迟高和带宽不足等问题常常影响ZOOM视频会议的体验。为了有效解决这些问题&#xff0c;SD-WAN组网开始被应用于ZOOM视频会议加速。 那么&#xff0c;SD-WAN具体是…

西门子DNC 程序传输

西门子的 840DSL 828D Siemens ONE DNC程序传输大概可以有几种方式实现&#xff1a; 1.FTP方式 缺点&#xff1a;每台设备都需要开通授权 优点&#xff1a;设置简单 2.共享文件夹 缺点&#xff1a;如果上位机联网容易中病毒 优点&#xff1a;免费 3.直接传送程序文件到NCU 缺…

图书管理系统初实现

目录 实现过程&#xff1a; 运行结果&#xff1a; 从三个模块来实现图书管理系统&#xff1a;书本、用户、实现的功能 实现过程&#xff1a; 首先在Book包下定义一个book类&#xff0c;包含书名、作者、价格、类型、是否借出成员变量。 这些成员变量都是私有的&#xff0c;…

算法第十六天:leetcode349.两个数组的交集

一、两个数组的交集的题目描述与链接 349.两个数组的交集如下表所示&#xff0c;您可以直接复制下面网址进入力扣学习&#xff0c;在观看下面的内容之前您一定要先做一遍哦&#xff0c;以便让你印象更加深刻&#xff01; https://leetcode.cn/problems/intersection-of-two-a…

Unity强化工程 之 音效

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 首先&#xff0c;音频这块组件较少&#xff0c;但是内容很重要&#xff0c;因为对于任何一款非特殊面向人群的游戏来说&a…

【人工智能】边缘计算与 AI:实时智能的未来

&#x1f48e; 我的主页&#xff1a;2的n次方_ &#x1f48e;1. 引言 随着物联网设备数量的爆炸性增长和对实时处理需求的增加&#xff0c;边缘计算与人工智能&#xff08;Edge AI&#xff09;成为一个热门话题。Edge AI 通过在本地设备上运行 AI 算法&#xff0c;减少对云计…

【秋招笔试】24-07-27-OPPO-秋招笔试题(算法岗)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 💡 第一题贪心模拟…

月木学途开发 3.2安装Nacos

安装jdk 查看jdk是否安装 java -version 下载网址&#xff1a;https://www.oracle.com/java/technologies/downloads/?er221886 下载命令&#xff1a; wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 解压&#xff1a; tar -zxvf jdk-17_…

【OpenCV C++20 学习笔记】imgproc模块-绘图基础

imgproc模块-绘图基础 Point和Scalar类型Point类型Scalar类型 绘图操作创建图片对象和显示窗口绘制椭圆绘制圆绘制多边形绘制矩形画线 完整代码 Point和Scalar类型 Point类型 该类型表示一个2D的点&#xff0c;其坐标由图像中的 x x x和 y y y坐标确定。可以这样定义一个Poin…

如何基于欧拉系统完成数据库的安装

一、安装 当我们直接进行安装软件包时&#xff0c;会提示有冲突&#xff0c;此时&#xff0c;我们应该这样来解决 使用rpm命令 [rootlocalhost yum.repos.d]# rpm -qa | grep selinux使用 rpm命令卸载以下两个软件包 [rootlocalhost yum.repos.d]# rpm -e selinux-policy-3…

B站安全开发流程落地实践

一. 什么是安全开发生命周期&#xff08;SDL&#xff09; 1.1 SDL诞生背景 随着互联网技术的快速发展&#xff0c;网络系统及应用在给人们的生活带来巨大便利的同时&#xff0c;信息安全问题也逐渐成为用户和企业关注的焦点。然而&#xff0c;安全问题的管理和解决需要一个系统…

TCP半关闭过程

TCP半关闭过程 简介 tcp半关闭是指在一端发送完数据后&#xff0c;关闭发送通道&#xff0c;而保持接收通道继续接收数据。 过程 这里设序号为Seqx&#xff0c;确认号为Acky 客户端&#xff08;也可以是服务端发起&#xff09;发送 [FIN&#xff0c;ACK] 报文段&#xff0…

【已解决】树莓派5使用VNC远程,无法正常显示桌面,黑屏提示:cannot currently show the desktop

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

外贸干货|业务员寻找客户的7个思维技巧,都掌握的才算合格

更多外贸干货及开发客户的方法&#xff0c;尽在微信【千千外贸干货】 做外贸最基本的是找到客户&#xff0c;如果没有完成这一步&#xff0c;纵使你有千万种转化客户的方法&#xff0c;也都只是纸上谈兵。 #一 关键词法 选择适当的关键词&#xff0c;直接查找潜在客户发布的求…

Manim实现在坐标轴上添加元素和获取元素

Manim实现在坐标轴上添加元素和获取元素 1.坐标轴上获取元素 构造函数&#xff1a; _get_axis_label(label, axis, edge, direction, buff0.1) 函数 _get_axis_label 旨在为图形表示中的给定轴生成和定位标签&#xff08;通常用于绘图或数学上下文中&#xff0c;可能是在某…

PostgreSQL 15

一、安装前的准备 1、版本信息 操作系统CentOS 7.9.2009PostgreSQL 版本PostgreSQL 15-15.7 2、下载安装包 RPM Chart - PostgreSQL YUM Repositoryhttps://yum.postgresql.org/rpmchart/进入官网&#xff0c;找到相应版本 点击框选内容 依次进入下载页面&#xff0c;下载相…