只要条件字段在联合索引里,MySQL8.0+ 默认都会触发 索引下推(ICP)

终极标准答案(面试直接背,100%不丢分

我把你这 3 条 SQL 一次性全部讲清楚:

会不会命中索引?用到几个?会不会索引下推?

全部给你最清晰、最准确、最严谨的结论!


先记住 2 条铁律(决定一切)

  1. 联合索引必须遵守最左前缀 ,跳过中间字段,后面字段无法用于索引查找
  2. 只要条件字段在联合索引里 ,MySQL 8.0+ 默认都会触发 索引下推(ICP),用来减少回表。

第一条 SQL

where a = 1 and c = 2; 联合索引 (a,b,c)

1. 用到哪几个索引字段?

只用到 a 字段,b 被跳过,c 无法用于索引查找!

  • a = 1 ✅ 命中(最左前缀)
  • b 没写,直接跳过
  • c = 2 ❌ 无法用于索引查找

2. 会不会用到索引下推?

会!一定会!

  • c 在联合索引里
  • 存储引擎在遍历 a=1 的索引数据时,直接在索引上过滤 c=2 ,不满足的不回表
    索引下推生效,减少回表次数

总结

命中索引:a(1个)
索引下推:生效(c 参与过滤)


第二条 SQL

where a = 1 and b > 2 and c in (1,2,3);

1. 用到哪几个索引字段?

a + b 命中,c 索引失效!

  • a =1 ✅
  • b >2 ✅(范围查询,自身有效)
  • 范围中断,后面 c 彻底失效,不能用于查找

2. 会不会索引下推?

会!

c 虽然不能用于查找,但它在索引里 ,MySQL 会在引擎层直接过滤 c in (...),不用回表。

总结

命中索引:a、b(2个)
索引下推:生效


第三条 SQL

where a =1 and b in (1,2,3) and c >3;

1. 用到哪几个索引字段?

a + b 命中,c 索引中断!

  • a=1 ✅
  • b in(等值)✅
  • c>3 范围,中断索引,不能用于查找

2. 会不会索引下推?

会!

c 在索引里,直接在索引上判断 c>3,不满足不回表。

总结

命中索引:a、b(2个)
索引下推:生效


终极汇总表(面试背这个)

SQL 命中索引字段数 索引下推(ICP)
a=1 and c=2 1个(a)
a=1 and b>2 and c in 2个(a,b)
a=1 and b in and c>3 2个(a,b)

最核心一句话(你必须记住)

  1. 最左前缀决定能不能"用索引快速查找"
  2. 字段是否在索引里,决定能不能"索引下推"
  3. 只要 c 在联合索引里,这三条 SQL 全部会触发索引下推!

面试官问:你怎么回答?(满分口述)

"联合索引(a,b,c):

  1. a=1 and c=2 :只命中 a ,跳过 b 导致 c 无法索引查找,但会用索引下推过滤 c
  2. a=1 and b>2 and c in :命中 a、b ,b 范围中断索引,c 索引失效,但会索引下推
  3. a=1 and b in and c>3 :命中 a、b ,c 范围中断索引,同样会索引下推

只要查询字段包含在联合索引中,MySQL 都会自动使用索引下推,在引擎层提前过滤,减少回表。"


相关推荐
DIY源码阁1 小时前
JavaSwing学生选课系统 - MySQL版
java·数据库·mysql·eclipse
流星白龙1 小时前
【MySQL高阶】6.MySQL数据目录,日志
android·mysql·adb
流星白龙1 小时前
【MySQL高阶】1.MySQL命令行客户端(1)
mysql
暴力求解2 小时前
MySQL操作库
数据库·mysql
流星白龙2 小时前
【MySQL高阶】2.MySQL命令行客户端(2)
android·mysql·adb
努力努力再努力wz2 小时前
【Qt入门系列】:QLabel控件详解:从文本显示到图片展示,再到内容布局与伙伴机制
android·开发语言·数据结构·数据库·c++·qt·mysql
流星白龙2 小时前
【MySQL高阶】5.MySQL服务器简介
服务器·mysql·adb
流星白龙2 小时前
【MySQL高阶】9.在一台机器上运行多个MySQL实例
数据库·mysql·adb
Rick19932 小时前
MySQL 优化器会选择【最小、最精准、最高效】的索引
数据库·mysql