Mysql联合索引和最左匹配例子说明

文章目录

    • 前言
    • 联合索引
    • 最左匹配原则
    • 举例说明

前言

是什么是索引?
索引是一种数据结构,用于加速数据库查询。

当没有索引时,数据库系统需要执行全表逐行扫描来满足查询需求。这意味着它会逐行读取整个表中的数据,并在内存中进行比较,以找到满足查询条件的数据行。由于数据通常存储在磁盘上,而磁盘的读取速度相对较慢,因此全表扫描会导致大量的磁盘 I/O 操作,这些磁盘 I/O 操作会耗费大量的时间。此外,全表扫描还会导致大量的数据被加载到内存中,这可能会耗尽内存资源,并导致性能下降

总结:在没有索引的情况下,MySQL必须从第一行开始逐行扫描整个表来查找相关的行。而有了索引,MySQL可以快速定位到数据文件中的某个位置,而无需查看所有数据。这比顺序读取每一行要快得多。

用个比喻解释:想象一下你手里拿着一本庞大的《新华字典》,你想查找某个字的解释,比如“锁”。如果没有索引,你可能会从第一页开始,一页一页地翻阅,直到找到这个字为止。这样的查找过程会非常耗时,因为你需要逐页逐字地浏览整本字典。新华字典通过查找目录可以快速定位到要查找字的位置。

联合索引

联合索引是一种数据库索引类型,它涵盖了多个列。与单列索引不同,联合索引允许同时在多个列上创建索引,以便在查询中更有效地过滤和定位数据。

举例:当我们对 (a, b, c) 字段建立索引时,实际上会创建三个索引:(a)、(a, b)、(a, b, c)。

最左匹配原则

最左匹配原则是指在使用联合索引进行查询时,只有索引的最左边的列开始的查询条件才会被利用到。如果查询条件不是从最左边的列开始,索引将不会被使用。

换句话说,当你创建了一个联合索引,比如 (a, b, c),如果你的查询条件中包含了索引的最左边的列 a,那么这个索引可以被用到。但如果查询条件只涉及到 b 或者 c 而不涉及到 a,那么这个索引将不会被使用。

但是就算是(a,b,c),当遇到范围查询(例如 >、<、BETWEEN、LIKE)时,就会停止匹配。 (见后面例子第三种)

举例说明

准备表:

CREATE TABLE test_index
(id    INT(10) NOT NULL PRIMARY KEY,col_a INT(11) NOT NULL DEFAULT 0 COMMENT '字段a',col_b INT(11) NOT NULL DEFAULT 0 COMMENT '字段b',col_c INT(11) NOT NULL DEFAULT 0 COMMENT '字段c',col_d INT(11) NOT NULL DEFAULT 0 COMMENT '字段d',KEY index_a_b_c (col_a, col_b, col_c) # 创建联合索引
) ENGINE = InnoDB;

分析查询语句:
第一种

explain select t.id, t.col_c, t.col_b, t.col_c, t.col_d
from test_index as t
where col_a=1 and col_b=1 and col_c=1;

结果可以发现正常使用到了联合索引
在这里插入图片描述
注意:
对于索引 (col_a, col_b, col_c),查询条件为 col_c=1 and col_b=1 and col_a=1,依然可以使用索引。尽管查询条件的顺序与索引定义的顺序不同,但因为查询条件包含了索引的所有列,数据库优化器仍然可以利用这个索引进行优化查询。

第二种:

explain select t.id, t.col_c, t.col_b, t.col_c, t.col_d
from test_index as t
where col_b=1 and col_c=1;

查询条件不满足最左前缀匹配原则,查询条件 col_b=1 and col_c=1 不是以索引的最左边列 col_a 开始的,因此无法利用索引。
在这里插入图片描述

第三种:

explain select t.id, t.col_c, t.col_b, t.col_c, t.col_d
from test_index as t
where col_a>1 and col_b=1 and col_c=1;

但是就算是(a,b,c),当遇到范围查询(例如 >、<、BETWEEN、LIKE)时,就会停止匹配。
在这里插入图片描述

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

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

相关文章

设计模式-状态模式在Java中的使用示例-信用卡业务系统

场景 在软件系统中&#xff0c;有些对象也像水一样具有多种状态&#xff0c;这些状态在某些情况下能够相互转换&#xff0c;而且对象在不同的状态下也将具有不同的行为。 为了更好地对这些具有多种状态的对象进行设计&#xff0c;我们可以使用一种被称之为状态模式的设计模式…

【提示学习论文】BlackVIP: Black-Box Visual Prompting for Robust Transfer Learning论文原理

BlackVIP: Black-Box Visual Prompting for Robust Transfer Learning BlackVIP:稳健迁移学习的黑盒视觉提示 问题 黑盒白盒&#xff1f; 黑盒和白盒的概念与对预训练模型内部参数的了解程度相关。黑盒指的是对预训练模型的参数和结构缺乏详细了解&#xff0c;通常只能通过使…

OpenCV 如何实现边缘检测器

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何实现拉普拉斯算子的离散模拟 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数…

测试用例设计方法-异常测试

飞的最高的海鸥&#xff0c;能看到最远的奇景。大家好&#xff0c;继续给大家分享如何进行异常测试&#xff0c;首先要做好异常测试&#xff0c;需要我们对被测系统进行全面的了解&#xff0c;熟悉被测系统的功能、架构和运行机制&#xff0c;然后在这个基础上尽可能覆盖各种的…

MATLAB命令

MATLAB是一个用于数值计算和数据可视化的交互式程序。您可以通过在命令窗口的MATLAB提示符 ‘>>’ 处键入命令来输入命令。 在本节中&#xff0c;我们将提供常用的通用MATLAB命令列表。 用于管理会话的命令 MATLAB提供了用于管理会话的各种命令。下表提供了所有此类命令…

递归神经网络(RNN)在AI去衣技术中的深度应用

在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;图像处理和计算机视觉领域不断取得新的突破。其中&#xff0c;AI去衣技术作为一个具有挑战性的研究方向&#xff0c;引起了广大研究者和公众的关注。递归神经网络&#xff08;RNN&#xff09;作为深度学习的…

《Python源码剖析》之PyTypeObject

前言 这一篇博客原本应该是写在上一篇关于pyObject对象的博客中的&#xff0c;但是为了不把内容写的又臭又长&#xff0c;给读者减轻痛苦&#xff0c;给我也减少压力&#xff0c;于是就专门用一篇介绍一下今天的主角—pyTypeObject。 开始 还记得在上一篇我们有聊到&#xf…

vscode 使用文件模板功能来添加版权信息

vscode 新建文件的时候&#xff0c;自动填充作者及版权信息 无需使用插件&#xff0c;操作如下&#xff1a; 选择 “首选项(Preferences)”。在搜索框中输入 “file template” 或者 “文件模板”&#xff0c;然后选择相关的设置项。 {"C_Cpp.clang_format_fallbackSt…

嵌入式虽然入门容易,但精通难度很大。

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;此外&#xff0c;嵌入式系统的…

蓝桥杯——分巧克力

思路非常简单&#xff0c;就是一个二分法。 注意一下l和r的取值&#xff0c;就可以了。 // 如何进行切分巧克力&#xff1a;横纵除法。例如&#xff1a;一块6*5的&#xff0c;欲切为3*3的小块&#xff0c;横&#xff1a;6/2 3&#xff1b;纵&#xff1a;5/31.所以可以切成3*…

职业技能鉴定服务中心(新闻系统+证书查询系统)

后端采用ThinkPHP8&#xff0c;最新tp框架 前端采用divcss布局 数据库采用MySQL 采用三种技术实现新闻系统和证书查询系统 源码&#xff1a;git clone https://gitee.com/3539949703/certificate-website.git 效果图如下&#xff1a;

[Linux_IMX6ULL驱动开发]-设备树简述

目录 设备树的引入 设备树具体框架 设备树的属性 label address-cells和size-cells compatible model status reg 设备树的编译 内核对设备树的处理 plateform_device如何对应plateform_driver 设备树的引入 之前已经学习了解过了总线驱动模型的概念&#xff0c;也…

webots学习记录8:R2023b如何在某个零件上添加一个恒定的力(矩)

在webots安装路径下&#xff0c;从include\controller\c\webots\supervisor.h中可以看到如下定义&#xff1a; void wb_supervisor_node_add_force(WbNodeRef node, const double force[3], bool relative); void wb_supervisor_node_add_force_with_offset(WbNodeRef node, c…

37-5 基于时间的盲注 SQL 注入 PoC 的 Python 编写

攻击目标就用sql靶场的第9关,手注与靶场搭建:22-5 SQL注入攻击 - 基于时间的盲注-CSDN博客 poc import concurrent.futures # 导入并发模块 import requests # 导入发送HTTP请求的库 import string # 导入处理字符串的库url = "http://127.0.0.1/sqli-labs-master…

AndroidStudio中虚拟机(AVD)无法启动,出现unable to locate adb错误

1.检查Android SDK Platform-Tools是否安装(个人是通过这个方法解决的) 首先通过File-Project Structure-Project SDK检查SDK有没有被选中 步骤&#xff1a;打开file -> settings &#xff0c;搜索SDK 之后点击"-",在点击Apply进行安装 2.可能是驱动的问题 电脑…

深入解析YOLOv2

深入解析YOLOv2 引言 目标检测是计算机视觉中的一个核心问题&#xff0c;它旨在识别图像中所有感兴趣的目标&#xff0c;并给出它们的类别和位置。近年来&#xff0c;随着深度学习技术的发展&#xff0c;目标检测领域取得了巨大的进步。YOLO&#xff08;You Only Look Once&a…

基于OSAL 实现UART、LED、ADC等基础示例 4

1 UART 实验目的 串口在我们开发单片机项目是很重要的&#xff0c;可以观察我们的代码运行情况&#xff0c;本节的目的就 是实现串口双工收发。 虽然说 osal 相关的代码已经跟硬件关系不大了&#xff0c;但是我们还是来贴出相关的硬件原理图贴出来。 1.1 初始化 osal_init_s…

交换式网络捕获网络流量的方法

交换式网络捕获网络流量的方法 参考资料&#xff1a; https://blog.csdn.net/weixin_44143678/article/details/107559329 # 一.端口镜像 端口镜像&#xff0c;又称为“端口监视”或“端口抄送”&#xff0c;是一种网络管理技术&#xff0c;旨在将网络设备上的特定端口的流…

PyTorch Conv2d 前向传递中发生了什么?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Springboot的日常操作技巧

文章目录 1、自定义横幅2、容器刷新后触发方法自定义3、容器启动后触发方法自定义**CommandLineRunner**ApplicationRunner 不定时增加 参考文章 1、自定义横幅 简单就一点你需要把banner.text放到classpath 路径下 &#xff0c;默认它会找叫做banner的文件&#xff0c;各种格式…