只要条件字段在联合索引里,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 都会自动使用索引下推,在引擎层提前过滤,减少回表。"


相关推荐
神龙天舞20016 小时前
MySQL 备库为什么会延迟好几个小时
android·数据库·mysql
每天都要进步哦11 小时前
SQL单行函数详解:字符、数字、日期、转换与通用函数全解析
数据库·mysql
南凉北往12 小时前
PandasAI连接LLM对MySQL数据库进行数据分析
数据库·mysql·数据分析
【心态好不摆烂】15 小时前
MySQL——复合查询
数据库·mysql
瞬间&永恒~16 小时前
【MySQL】 InnoDB 锁等待排查与并发压测实验
运维·数据库·mysql
烟漠河洛16 小时前
俄罗斯电商3200亿卢布疯长:跨境支付与多平台订单系统架构解析
mysql·php
总捣什么乱117 小时前
MySQL MySQL是怎么保证主备一致的?
android·mysql·adb
鹿鸣天涯20 小时前
应急响应:MySQL日志分析
mysql·安全·adb·oracle
学编程就要猛20 小时前
解析博客系统后端实现
java·mysql·jwt·摘要算法·加盐
9624561 天前
从 DBeaver 内存溢出到流式导入:一个 MySQL 生产数据迁移工具的开发实战
数据库·mysql·adb