当前位置: 首页 > news >正文

MySQL最左匹配原则

MySQL索引的加左原则,也被称为最左匹配原则(Leftmost Prefix Rule)或最左前缀规则(Leftmost Prefixes),是指在创建复合索引时,应将经常用于查询的列放在索引的最左边,以便MySQL能够更有效地使用该索引来优化查询性能。

为什么要遵循加左原则?

MySQL索引的加左原则(Leftmost Prefix Rule)是由于其B-Tree索引的数据结构和存储方式决定的。

B-Tree索引是一种平衡的多路查找树,它将数据存储在一个有序的结构中,允许快速查找、插入和删除操作。每个叶子节点包含了对应的行数据指针或行数据本身,而非叶子节点则包含了索引值和指向子树的指针。

在复合索引中,MySQL会将多个列的值组合成一个键来进行排序和查找。这个键的排序方式是从左到右的,也就是说,MySQL首先会比较这个复合键的最左边一列,然后是第二列,以此类推。

当MySQL执行一个查询时,它会尝试使用索引来加速查找。它会从索引的最左边开始匹配查询条件,并逐步向右移动。如果查询条件与索引的某一列不匹配,MySQL就无法继续使用该索引来过滤数据了。

以下是几个原因,解释了为什么MySQL索引有加左原则:

数据排序:B-Tree索引是按照复合键的顺序进行排序的,首先是最左边的列。如果你不遵循加左原则,索引的排序方式就与查询条件的顺序不匹配,导致MySQL无法有效地使用索引。

索引范围扫描:当你在WHERE子句中使用范围查询(如WHERE col1 > 10 AND col1 < 20)时,MySQL可以使用索引的最左边一列来确定需要扫描的索引范围。只有当查询条件与索引的最左边一列匹配时,MySQL才可以执行索引范围扫描。

索引选择性:选择性是指索引中不同值的数量与总行数的比率。最左边的列应该是选择性最高的列,这样可以使MySQL更快地排除不符合条件的行。

索引覆盖:如果你的查询只涉及到复合索引中的一部分列,并且这些列正好是最左边的几列,那么MySQL可以直接从索引中获取所需的数据,而不需要回表查找。这种情况被称为“索引覆盖”,可以极大地提高查询效率。

索引合并:在某些情况下,MySQL可能会使用多个索引来优化查询。最左匹配原则可以帮助MySQL更好地选择和合并这些索引。

总之,遵循加左原则可以使MySQL更好地利用B-Tree索引的特性,提高查询效率。然而,索引设计是一个复杂的过程,需要根据具体的查询模式和数据分布来决定最佳的索引策略。

遵循最左匹配原则可以帮助MySQL更有效地使用复合索引来加速查询。以下是几个原因:

减少查找的范围:当MySQL从索引的最左边开始匹配时,它可以快速缩小需要查找的数据范围,从而提高查询速度。

避免全表扫描:如果不遵循最左匹配原则,MySQL可能需要进行全表扫描来找到符合条件的数据,这将大大降低查询性能。

提高索引的选择性:选择性是指索引中不同值的数量与总行数的比率。如果最左边的列有很高的选择性,MySQL可以更准确地估计数据分布,选择更好的执行计划。

举例说明:

假设我们有一个名为users的表,包含nameageaddress三列,并且我们创建了一个复合索引(name, age)

  1. 完全匹配:如果查询语句是SELECT * FROM users WHERE name = 'John' AND age = 30;,MySQL会从索引的最左边开始匹配,首先匹配name列,然后匹配age列。因为查询条件与索引的最左边两列完全匹配,所以MySQL可以使用整个复合索引来快速定位数据。

  2. 部分匹配:如果查询语句是SELECT * FROM users WHERE age = 30 AND name = 'John';,MySQL仍然会从索引的最左边开始匹配,但它首先尝试匹配age列,因为age在索引的最左边。由于age列不是完全匹配的第一个条件,MySQL只能使用索引的部分(即age列)来过滤数据,剩余的条件(name = 'John')需要在过滤后的结果集中进行额外的检查。

  3. 不匹配:如果查询语句是SELECT * FROM users WHERE address = 'New York';,MySQL无法使用这个复合索引来优化查询,因为address列不在索引的最左边。

如何应用加左原则?

  1. 分析查询语句:在创建复合索引之前,仔细分析你的查询语句,确定哪些列经常被用作查询条件。

  2. 选择正确的顺序:将这些列按照使用频率或选择性从高到低的顺序排列在复合索引中。选择性是指索引中不同值的数量与总行数的比率,选择性越高,索引越有用。

  3. 避免使用函数或表达式:在索引中使用函数或表达式会使MySQL无法使用索引的最左匹配原则。尽量在查询语句中避免对索引列使用函数或表达式。

  4. 注意索引类型:不同的索引类型(如B-Tree索引、Hash索引)对最左匹配原则的适用性不同。B-Tree索引是最常用的索引类型,也是唯一支持范围查询的索引类型,适合大多数情况。

  5. 使用EXPLAIN分析:使用EXPLAIN语句来分析你的查询语句,了解MySQL是如何使用索引的。如果发现MySQL不是使用你预期的索引,可能需要重新考虑你的索引策略。

例外情况

使用全文索引:全文索引不遵循最左匹配原则,因为它们是用来支持复杂的文本搜索的。

使用覆盖索引:覆盖索引包含了查询语句所需的所有列,MySQL可以直接从索引中获取数据,而不需要访问表数据。在这种情况下,不需要遵循最左匹配原则。

注意事项

  1. 不要过度索引:虽然复合索引可以提高查询效率,但过度索引会增加写入操作的开销,并可能导致索引维护的性能问题。

  2. 适当调整索引顺序:如果你的查询模式发生了变化,可能需要重新评估并调整索引的顺序。

  3. 考虑使用单列索引:对于某些列,如果它们经常单独用作查询条件,或者作为WHERE子句中的第一个条件,可能更适合使用单列索引而不是复合索引。

使得索引失效或效果不佳的情况:

  1. 没有使用最左边的索引列:如果你的查询条件不包含复合索引的最左边一列,MySQL就不能使用这个索引来过滤数据。例如,假设你有一个复合索引(col1, col2, col3),但你的查询语句是SELECT * FROM table WHERE col2 = 'value2' AND col3 = 'value3';,那么MySQL可能不会使用这个复合索引。

  2. 在最左边的索引列上使用不等值条件:如果你在最左边的索引列上使用了不等值条件(如WHERE col1 > 'value1'),MySQL可能会选择不使用索引,而进行全表扫描。因为在B-Tree索引中,等值条件可以帮助MySQL快速定位到需要查找的数据范围。

  3. 在最左边的索引列上使用函数或表达式:如果你在最左边的索引列上使用了函数或表达式(如WHERE LEFT(col1, 3) = 'abc'),MySQL也不能使用索引。因为索引是基于原始值建立的,而不是基于函数或表达式的结果。

  4. 在最左边的索引列上使用LIKE查询且通配符在前面:如果你的LIKE查询的通配符在前面(如WHERE col1 LIKE '%value1'),MySQL同样不能使用索引。因为通配符在前面,MySQL无法确定从哪里开始查找。

  5. 使用OR条件连接索引列:如果你在WHERE子句中使用OR条件来连接不同的索引列(如WHERE col1 = 'value1' OR col2 = 'value2'),MySQL可能会选择不使用索引,而进行全表扫描。因为OR条件会扩大查询结果的范围,MySQL很难通过索引来确定哪些行符合条件。

  6. 索引列的选择性太低:如果最左边的索引列的选择性非常低(即大多数行都有相同的值),那么MySQL可能会选择不使用索引,而直接扫描表数据。

  7. 索引列顺序与查询条件顺序不一致:如果你的复合索引列的顺序与查询条件的顺序不一致,MySQL可能会选择不使用索引,或者使用索引但效果不佳。例如,假设你有一个复合索引(col1, col2),但你的查询语句是SELECT * FROM table WHERE col2 = 'value2' AND col1 = 'value1';,那么MySQL可能不会使用这个复合索引。

  8. 索引列中存在NULL值:如果最左边的索引列中存在NULL值,MySQL可能会选择不使用索引。因为NULL值的存在使得MySQL无法确定索引的顺序和范围。

  9. 使用了不等于(!=)或NOT IN操作符:这些操作符会使得MySQL无法确定从哪里开始或结束扫描索引,因此可能会选择不使用索引。

以上这些情况都可能导致MySQL索引失效或效果不佳。如果你发现自己的查询语句没有使用到预期的索引,可以使用EXPLAIN语句来分析查询计划,找出原因,并进行相应的优化。记住,索引设计是一个动态的过程,需要根据实际的查询模式和数据分布来调整。

相关文章:

MySQL最左匹配原则

MySQL索引的加左原则&#xff0c;也被称为最左匹配原则&#xff08;Leftmost Prefix Rule&#xff09;或最左前缀规则&#xff08;Leftmost Prefixes&#xff09;&#xff0c;是指在创建复合索引时&#xff0c;应将经常用于查询的列放在索引的最左边&#xff0c;以便MySQL能够更…...

日常开发1:居中处理

开发的时候总会遇到两个空间上下两层,然后居中排放,如果只是知道下方或者上方控件的具体位置点,但是不知道另外一个控件的集体点位,应该怎么处理呢? 如上图所示,知道imageview 下方中间的点的位置(这里暂时定义image的宽高已知),上方是textview,那么如何布局呢? 简单解决方法…...

css弹性盒子——flex布局

目录 ​编辑 一、flex容器的样式属性(父元素属性) display:flex 弹性盒子&#xff0c;实现水平排列,在父盒子设置&#xff0c;适用于单行/单列 justify-content 二、flex元素的样式属性(子元素属性) 1.flex-grow 2.flex-shrink 3.flex-basis 4.flex组合属性 flex:flex-…...

亚马逊云科技 Gen BI 2024-09-04 上海站QuickSight

机缘 我又来了&#xff0c;感觉不上班比上班还要忙 天天像特种工一天&#xff0c;今天有度过的充实的一天&#xff0c;上午去图书馆&#xff0c;下午去了 亚马逊云科技 Gen BI 技术体验日 。 具体照片可以去 这里看 哈哈&#xff0c;这个就是我了 商业智能的趋势 根据艾瑞咨…...

【Qt】Qt和JavaScript使用QWebChannel交互

问题 问题一&#xff1a; 问题描述&#xff1a;运行时&#xff0c;Qt向Js端发送消息没有问题&#xff0c;Js端向Qt端发送消息时失败 报错&#xff1a;Cannot invoke unknown method of index -1 on object webTransport(0x…) 原因及解决办法&#xff1a;使用Qt 5.11.2编译生…...

码住!15个爆好用知识库软件工具分享

市场趋势&#xff1a;全球知识库管理软件的市场规模发展速度非常快&#xff0c;并且未来几年内仍将继续保持增长。据Verified Market Research预测&#xff0c;2028年知识库管理软件的全球市场份额将增长到588.1亿美元&#xff0c;复合年增长率达12.67%。 知识库软件可以帮助企…...

MybatisPlus中@EnumValue注解介绍、应用场景和示例代码

EnumValue注解详细介绍 功能概述&#xff1a; EnumValue注解标记在枚举类型的字段上&#xff0c;表示该字段是枚举值在数据库中存储的实际值。这对于枚举的持久化是关键&#xff0c;确保枚举在数据库中的表示与Java枚举类的一致性。 主要用途&#xff1a; 字段指定&#xff1a;…...

【计算机网络】描述TCP建立连接与断开的过程

一、TCP连接的建立与断开 1、建立连接——三次握手 1、A的TCP向B发出连接请求报文段 其首部中的同步位SYN 1&#xff0c;并选择序号seq x&#xff0c;表明传送数据时的第一个数据字节的序号是 x 2、B的TCP收到连接请求报文段后&#xff0c;如同意&#xff0c;则发回确认。 B …...

CSS学习14[重点]

定位 前言一、定位二、定位模式1. 静态定位 static2. 相对定位 relative3. 绝对定位 absolute4. 子绝父相5. 绝对定位的盒子水平居中 6. 固定定位&#xff08;fixed&#xff09;7. 叠放次序&#xff08;z&#xff09;三、四种定位总结四、定位模式转换 前言 为什么学习定位&am…...

力扣 | 递归 | 区间上的动态规划 | 486. 预测赢家

文章目录 一、递归二、区间动态规划 LeetCode&#xff1a;486. 预测赢家 一、递归 注意到本题数据范围为 1 < n < 20 1<n<20 1<n<20&#xff0c;因此可以使用递归枚举选择方式&#xff0c;时间复杂度为 2 20 1024 ∗ 1024 1048576 1.05 1 0 6 2^{20…...

黑白格

题目描述 小杨有一个 n 行 m 列的网格图&#xff0c;其中每个格子要么是白色&#xff0c;要么是黑色。 小杨想知道至少包含 k 个黑色格子的最小子矩形包含了多少个格子。 输入格式 第一行包含三个正整数 n,m,k&#xff0c;含义如题面所示。 之后 n 行&#xff0c;每行⼀个…...

数据链路层(MAC地址)

文章目录 数据链路层&#xff08;MAC地址&#xff09;1、以太网2、以太网帧格式3、MAC地址4、对比理解 MAC 地址和 IP 地址5、最大传输单元&#xff08;MTU&#xff09;6、MTU 对 IP 协议的影响7、MTU 对 UDP 协议的影响8、MTU 对 TCP 协议的影响9、查看硬件地址和 MTU10、ARP …...

【ruby java】登陆功能/邮件发送模版240903

Rails 风格登录系统添加全面而详细的注释&#xff0c;解释每个部分的功能和用途。​​​​​​​​​ 详细注释&#xff0c;解释了每个文件和代码块的功能。以下是一些关键点的总结&#xff1a; 1. 控制器&#xff08;Controllers&#xff09;: - ApplicationController: …...

告别格式不兼容烦恼!ape转换mp3,分享3个简单方法

各位读者们&#xff0c;你们是否有过这种体验&#xff1a;满怀期待地在网上下载一首好听的歌曲&#xff0c;结果怎么点击手机都播放不了&#xff0c;定睛一看&#xff0c;弹窗显示“无法播放该音频文件”。这是为什么呢&#xff1f;原来那首歌的音频格式是ape&#xff0c;不被手…...

Java核心知识体系-并发与多线程:线程基础

1 先导 Java线程基础主要包含如下知识点&#xff0c;相信我们再面试的过程中&#xff0c;经常会遇到类似的提问。 1、线程有哪几种状态? 线程之间如何转变&#xff1f; 2、线程有哪几种实现方式? 各优缺点&#xff1f; 3、线程的基本操作&#xff08;线程管理机制&#xff…...

KRaft模式下的Kafka启动指南:摆脱Zookeeper依赖

一、背景介绍 多年来&#xff0c;人们一直在同时使用Apache ZooKeeper和Apache Kafka。但是自Apache Kafka 3.3发布以来&#xff0c;它就可以在没有ZooKeeper的情况下运行。同时它包含了新的命令kafka-metadata-quorum和kafka-metadata-shell?该如何安装新版kafka&#xff0c…...

【数据库】MySQL-基础篇-函数

专栏文章索引&#xff1a;数据库 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、简介 二、字符串函数 三、数值函数 四、日期函数 五、流程函数 一、简介 函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#xff0c;这一段程序或代码在 M…...

dp练习【4】

最长数对链 646. 最长数对链 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。 现在&#xff0c;我们定义一种 跟随 关系&#xff0c;当且仅当 b < c 时&#xff0c;数对 p2 [c, d] 才可以跟在 p1 [a, b…...

php 实现推荐算法

在PHP中实现推荐算法的应用场景通常包括电商、社交媒体、内容平台等。推荐算法可以帮助用户找到与其兴趣相关的内容&#xff0c;提高用户体验和平台黏性。以下是几种常见的推荐算法及其PHP实现方式&#xff1a; 1. 基于协同过滤的推荐算法 协同过滤&#xff08;Collaborative…...

相机光学(三十六)——光圈

0.参考链接 &#xff08;1&#xff09;Hall光圈和Piris光圈的区别 &#xff08;2&#xff09;自动光圈及P-IRIS原理 1.光圈分类 Hall光圈和Piris光圈是两种不同的光圈技术。它们之间的区别如下&#xff1a; Hall光圈&#xff1a;Hall光圈是一种传统的光电子元件&#xff0c;通…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...