大数跨境
0
0

【MySQL 优化必备】联合索引的最左前缀原则,一次说透!

【MySQL 优化必备】联合索引的最左前缀原则,一次说透! Linux运维技术之路
2025-10-22
1
导读:【MySQL 优化必备】联合索引的最左前缀原则,一次说透!

 










 

【MySQL 优化必备】联合索引的最左前缀原则,一次说透!

今天我们来聊聊 MySQL 优化中一个经典问题 —— 最左前缀原则

👉 面试官经常会问:

  • • “联合索引为什么要遵循最左前缀原则?”
  • • “建了 (a,b,c) 联合索引,能用在哪些查询上?”

很多同学脑袋一懵,只能说:

“好像要从左到右用才行吧……”

其实,最左前缀原则背后有一套清晰的逻辑。


一、什么是联合索引?

联合索引(Composite Index) 指在多个字段上建立的索引。

👉 举例:


   
    
   CREATE INDEX idx_name_age_city ON user(name, age, city);

这个索引就包含了 nameagecity 三个字段。


二、最左前缀原则

📌 定义:
MySQL 在使用联合索引时,会优先按照最左边的字段开始匹配,一旦中间某个字段没有出现在查询条件里,后面的字段索引就可能失效。

👉 口诀:从左往右,不能跳过


三、举例说明

假设我们有联合索引 (name, age, city)

1. 能用索引的情况 ✅


   
    
   -- 命中 name
SELECT
 * FROM user WHERE name = 'Tom';

-- 命中 name + age

SELECT
 * FROM user WHERE name = 'Tom' AND age = 20;

-- 命中 name + age + city

SELECT
 * FROM user WHERE name = 'Tom' AND age = 20 AND city = 'Beijing';

-- 命中前缀 (like 'Tom%')

SELECT
 * FROM user WHERE name LIKE 'Tom%';

2. 不能完全用索引的情况 ❌


   
    
   -- 跳过 name,直接查 age
SELECT
 * FROM user WHERE age = 20;  -- 索引失效

-- 中间断开,跳过 age

SELECT
 * FROM user WHERE name = 'Tom' AND city = 'Beijing';

👉 原因:联合索引底层是按 (name, age, city) 排序存储的,必须先利用到 name,才能继续利用后面的字段。


四、最左前缀原则的核心逻辑

  • • 索引是按照字段顺序构建的(类似电话簿)。
  • • (name, age, city) 就像“按姓名 → 年龄 → 城市”排序的电话簿。
  • • 你想用“城市”直接查?抱歉,没法利用。

五、优化技巧

  1. 1. 把区分度高的字段放在前面
    • • 比如手机号、身份证号适合放在联合索引最左边。
  2. 2. 合理设计查询 SQL
    • • 确保能利用到最左前缀。
  3. 3. 避免函数和隐式转换
    • • 比如 WHERE name LIKE '%Tom',前缀没用到,索引失效。

六、总结一句话

  • • 最左前缀原则 = 从左往右用索引,不能跳过中间
  • • 口诀:用到左边,才能用到右边;跳过中间,后面失效。
  • • 实战建议:建索引时,把区分度高的字段放前面,SQL 写法尽量命中最左前缀。

🎯 面试必备回答:

联合索引遵循最左前缀原则,即查询必须从最左的字段开始匹配,才能利用索引。
比如索引 (a,b,c),能用于 aa+ba+b+c,但不能直接用于 b 或 c
因为索引是按照字段顺序存储的,只有按顺序使用才能利用到排序的特性。

 




 

 


往期回顾


【声明】内容源于网络
0
0
Linux运维技术之路
专注运维架构、高可用、高并发、高性能、大数据、容器化、数据库、python、devops等开源技术和实践的分享。
内容 347
粉丝 0
Linux运维技术之路 专注运维架构、高可用、高并发、高性能、大数据、容器化、数据库、python、devops等开源技术和实践的分享。
总阅读710
粉丝0
内容347