MySQL 索引的最左前缀匹配原则是什么?
MySQL 索引的最左前缀匹配原则
最左前缀匹配原则是 MySQL 使用联合索引时的一个重要优化规则。它指的是在查询条件中,只有符合索引最左侧字段开始的连续前缀部分时,索引才能被有效利用。
1. 最左前缀匹配的含义
- 联合索引:一个索引包含多个列,如
CREATE INDEX idx_col ON table (a, b, c);。 - 最左前缀:指联合索引中从最左侧开始连续的一个或多个列。
只有查询条件使用了从最左侧开始的列,或者符合从最左侧列开始的部分连续列时,索引才会生效。
2. 示例分析
(1)创建联合索引
假设有如下表结构:
CREATE TABLE users (
id INT PRIMARY KEY,
a INT,
b INT,
c INT,
KEY idx_abc (a, b, c)
);
(2)不同查询条件的索引使用情况
| 查询条件 | 最左前缀匹配 | 是否使用索引 |
|---|---|---|
WHERE a = 1 |
匹配 a |
是 |
WHERE a = 1 AND b = 2 |
匹配 a, b |
是 |
WHERE a = 1 AND b = 2 AND c = 3 |
匹配 a, b, c |
是 |
WHERE b = 2 |
不匹配(未从最左列开始) | 否 |
WHERE c = 3 |
不匹配(未从最左列开始) | 否 |
WHERE b = 2 AND c = 3 |
不匹配(跳过了 a) | 否 |
3. 索引前缀的灵活性
(1)范围查询对索引的影响
- 范围条件(如
<,>,BETWEEN,LIKE等)会中断最左前缀匹配后续列的索引使用。
示例:
SELECT * FROM users WHERE a = 1 AND b > 2 AND c = 3;
- 分析:
a = 1和b > 2满足索引a, b的最左前缀匹配。- 但由于
b > 2是范围查询,c = 3无法继续利用索引。
(2)LIKE 模式匹配
- 如果
LIKE以通配符(如%)开头,会破坏索引匹配。
示例:
SELECT * FROM users WHERE a LIKE '1%' AND b = 2;
a LIKE '1%'可以使用索引。
SELECT * FROM users WHERE a LIKE '%1' AND b = 2;
a LIKE '%1'无法使用索引。
4. 优化查询以符合最左前缀匹配
调整查询条件顺序:
- 确保条件从联合索引的最左列开始,并连续覆盖。
避免跳列:
- 联合索引的中间列不能跳过,否则后续列的索引无法使用。
分解查询:
- 将无法利用索引的查询分解成可以利用索引的多次查询。
5. 总结
- 原则:联合索引必须从最左列开始匹配,且列之间连续。
- 范围条件的影响:范围条件会阻断后续列的索引使用。
- 优化建议:根据最左前缀匹配原则设计查询条件,确保索引能够高效利用。
理解和遵循最左前缀匹配原则,是使用 MySQL 联合索引优化查询性能的关键。
MySQL 索引的最左前缀匹配原则是什么?的更多相关文章
- 关于MySQL索引的最左前缀匹配原则原理说明说明
假设有2个这样的SQL SELECT * FROM table WHERE a = 1 AND c = 3; // c不走索引 SELECT * FROM table WHERE a = 1 AND ...
- 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知
面试官: 我看你的简历上写着精通MySQL,问你个简单的问题,MySQL联合索引有什么特性? 心想,这还不简单,这不是问到我手心里了吗? 听我给你背一遍八股文! 我: MySQL联合索引遵循最左前缀匹 ...
- mysql 最左前缀匹配原则
1.在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,示例:对列col1.列col2和列col3建一个联合索引 KEY index_col1_co ...
- MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序
MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序 What's Index ? 索引就是帮助RDBMS高效获取数据的数据结构. 索引可以让我们避免一行一行进行全表扫描.它的 ...
- MySQL 的索引和最左前缀原则
这两天看<构建高性能Web站点>这本书,感觉写的真是不错,很多实际项目中会碰到的问题都有所提及,今天看到一个最左前缀原则,以前也听说过,不过一直没搞明白,今天查了下. 通过实例理解单列索引 ...
- mysql多列索引和最左前缀
数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度.索引优化是数据库优化的最重要手段. 如果查询语句使用 ...
- mysql索引之一:索引基础(B-Tree索引、哈希索引、聚簇索引、全文(Full-text)索引区别)(唯一索引、最左前缀索引、前缀索引、多列索引)
没有索引时mysql是如何查询到数据的 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储10 ...
- mysql索引之四:复合索引之最左前缀原理,索引选择性,索引优化策略之前缀索引
高效使用索引的首要条件是知道什么样的查询会使用到索引,这个问题和B+Tree中的“最左前缀原理”有关,下面通过例子说明最左前缀原理. 一.最左前缀索引 这里先说一下联合索引的概念.MySQL中的索引可 ...
- Mysql联合索引的最左前缀原则以及b+tree
软件版本mysql5.7 根据官网的文档 https://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html 查询条件要符合最左原 ...
- MySQL的索引类型和左前缀索引
1.索引类型: 1.1B-tree索引: 注:名叫btree索引,大的方面看,都用的是平衡树,但具体的实现上,各引擎稍有不同,比如,严格的说,NDB引擎,使用的是T-tree,但是在MyISAM,In ...
随机推荐
- 四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)
四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用) @ 目录 四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解 ...
- 『Python底层原理』--CPython如何编译代码
前一篇我们介绍了CPython VM的运行机制,它基于一系列字节码指令来实现程序逻辑. 不过,Python字节码在完整描述代码功能上存在局限性,于是代码对象应运而生.像模块.函数这类代码块的执行,本质 ...
- 从倒水问题到盛最多水的容器:一道经典的双指针应用题|LeetCode 11 盛最多水的容器
LeetCode 11 盛最多水的容器 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 你有没有遇到过这样的场景:家里要举办派对,需要准备一个大 ...
- NFS服务器离线问题解决
NFS服务器离线问题解决 NFS服务器挂了会导致挂载的NFS客户端主机卡顿延迟,或者提示找不到文件 因为在执行一些命令的时候会自动去同步,用作同步的NFS服务端挂了,命令执行就会卡住 不过听说NFS还 ...
- [CF576E] Painting Edges 题解
模版题的升级了. 使用二分图经典判定方法(一个点拆成两个点 \(x,x+n\),连边 \((x,y)\) 就是连接 \((x,y+n),(x+n,y)\),那么是否是二分图就等价于判断 \(x,x+n ...
- Android应用禁止屏幕休眠的3种方法
做android应用开发时,有时需要在应用前台运行时,禁止休眠,以下几种方法供参考. 方法一:持有wakelock 添加休眠锁,休眠锁必须成对出现. private wakelock mwakeloc ...
- CART回归树基本原理(具体例子)
id3不能直接处理连续性的特征,需要将连续性的转化成离散的,但是会破坏连续性特征的内在结构. 一.概念 CART全称叫Classification and Regression Tree.首先要强调的 ...
- 百万架构师第四十三课:Nginx:Nginx 应用实战|JavaGuide
百万架构师系列文章阅读体验感更佳 原文链接:https://javaguide.net 公众号:不止极客 课程目标: Nginx 反向代理功能配置 Nginx 负载均衡实战 Nginx 动静分离配置 ...
- SpringBoot - [02] 第一个SpringBoot程序
jdk maven3.6.3 springboot最新版 idea 如果使用官网 Spring Initializr ,则需要jdk17.21.22,并且是Springboot3.x 可以在idea创 ...
- C#弃元表达式的用法
原文地址:http://cshelloworld.com/home/detail/1803462343674433536 弃元符号是什么 弃元符号在C#中只是一个下划线 _,当程序员不想关注某些变量的 ...