MySQL的最左前缀原则是什么?

👉 使用联合索引时,查询条件必须从索引的最左列开始,并且连续使用,索引才能生效。

举个直观例子 🌰

假设有一个联合索引:

sql 复制代码
CREATE INDEX idx_abc ON user(a, b, c);

索引顺序是:a → b → c


一、哪些情况能用上索引 ✅

1️⃣ 只用最左列

WHERE a = 1

✔ 用到索引(a)


2️⃣ 连续使用前几列

WHERE a = 1 AND b = 2

✔ 用到索引(a, b)

WHERE a = 1 AND b = 2 AND c = 3

✔ 用到索引(a, b, c)


3️⃣ 范围后面会"断链"

WHERE a = 1 AND b > 10 AND c = 3

✔ 用到索引(a, b)

c 用不上索引

👉 遇到范围查询(>, <, BETWEEN, LIKE 'xx%')后,后面的列失效


二、哪些情况用不上索引 ❌

1️⃣ 跳过最左列

WHERE b = 2

❌ 用不上索引

WHERE b = 2 AND c = 3

❌ 用不上索引


2️⃣ 中间断了

WHERE a = 1 AND c = 3

✔ 只用到 a

❌ c 用不上


3️⃣ 对索引列做函数或计算

WHERE a + 1 = 2

❌ 索引失效

WHERE LEFT(a, 3) = 'abc'

❌ 索引失效


三、LIKE 查询的特殊情况 🔍

WHERE a LIKE 'abc%'

✔ 可以用索引(前缀匹配)

WHERE a LIKE '%abc'

❌ 用不上索引(左边模糊)


四、为什么会有这个原则?🧠

因为 联合索引在 B+Tree 中是按顺序存储的

(a1,b1,c1) (a1,b1,c2) (a1,b2,c1) (a2,b1,c1)

👉 MySQL 只能从左到右 逐层缩小范围

👉 没有 a,就没法直接定位 b、c


提问1:联合索引 (a, b, c),执行 where b = 1 and a = 2 能用上索引吗?

回答1:能用上。MySQL 的查询优化器会自动调整条件顺序,把 a = 2 放到前面,所以写成 where b = 1 and a = 2 和 where a = 2 and b = 1 效果一样。优化器足够聪明,不用纠结 SQL 里条件的书写顺序。


提问2:为什么 >= 不会停止匹配,但 > 会停止匹配?

回答2:关键在于能不能精确定位到一条记录。a >= 1 可以先精确定位到 a = 1 的第一条数据,这时候 b、c 在 a = 1 内部是有序的,可以继续匹配。而 a > 1 定位到的是 a = 2 的第一条数据,此时已经跨过了 a = 1 的整个范围,不同 a 值之间 b、c 是无序的,所以后面的列用不上索引。


提问3:建联合索引时,列的顺序应该怎么考虑?

回答3:一般有几个原则:

1)高频查询条件放左边,保证常用查询能走索引

2)区分度高的列放左边,能更快过滤掉数据

3)范围查询的列放最右边,避免阻断后面列的匹配

4)如果经常有排序需求,把排序字段放到索引里,避免 filesort

相关推荐
未来之窗软件服务19 分钟前
计算机等级考试—高频英语词汇—东方仙盟练气期
数据库·计算机软考·东方仙盟
lekami_兰22 分钟前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
JQLvopkk42 分钟前
C# 轻量级工业温湿度监控系统(含数据库与源码)
开发语言·数据库·c#
devmoon2 小时前
在 Polkadot Runtime 中添加多个 Pallet 实例实战指南
java·开发语言·数据库·web3·区块链·波卡
认真的薛薛2 小时前
数据库-sql语句
数据库·sql·oracle
爱学英语的程序员2 小时前
面试官:你了解过哪些数据库?
java·数据库·spring boot·sql·mysql·mybatis
·云扬·3 小时前
MySQL Redo Log落盘机制深度解析
数据库·mysql
用户982863025683 小时前
pg内核实现细节
数据库
码界筑梦坊4 小时前
330-基于Python的社交媒体舆情监控系统
python·mysql·信息可视化·数据分析·django·毕业设计·echarts
飞升不如收破烂~4 小时前
Redis 分布式锁+接口幂等性使用+当下流行的限流方案「落地实操」+用户连续点击两下按钮的解决方案自用总结
数据库·redis·分布式