索引失效故障复盘
2021年某电商平台的商品搜索接口突然变慢,平均响应时间从50ms飙升到20s。
技术团队排查后发现:开发同学在一次需求迭代中,把搜索条件的日期格式从字符串改成了函数调用,结果导致原本建好的索引全部失效。
更可怕的是:这个问题在测试环境没有复现,因为测试数据量小,全表扫描也很快,只有在生产环境的千万级数据量下才暴露。
这次故障导致商品搜索不可用2小时,直接损失约300万元。
【面试官手记】
索引失效是生产环境最隐蔽的问题之一。我面试过的候选人里,能说清楚"索引失效原因"的有40%,能说清楚"最左前缀原则"的有30%,能说清楚"优化方法"的有20%。索引失效的关键词是理解原理 + 避免踩坑。
一、索引失效的十大原因 🔴
1.1 十大原因详解
1.2 函数/运算导致失效
1.3 隐式类型转换
1.4 最左前缀不匹配
二、OR导致索引失效 🟡
2.1 OR索引失效
2.2 IN/NOT IN索引失效
三、索引优化实战 🟡
3.1 索引设计原则
3.2 SQL改写优化
3.3 强制使用索引
四、生产避坑 🟡
4.1 索引失效的五大坑
坑1:日期查询用函数
坑2:字符串字段传数字
坑3:OR连接没有索引的字段
坑4:最左前缀跳跃
坑5:测试环境数据量小
4.2 索引检查清单
五、真实面试回放 🟡
面试官:什么情况下索引会失效?
候选人(小张):十大原因:
一是函数运算。对索引列使用函数。
二是隐式类型转换。VARCHAR字段传数字。
三是最左前缀不匹配。查询跳过第一列。
四是LIKE前缀。
五是OR。
六是范围查询后。
七是IS NULL。
八是NOT。
九是字符串不加引号。
十是数据量小,全表扫描更快。
面试官:最左前缀原则说一下。
小张:联合索引(a, b, c),查询必须从a开始。
WHERE a = 1 → 用索引。
WHERE a = 1 AND b = 1 → 用索引。
WHERE b = 1 → 不用索引。
WHERE a = 1 AND c = 1 → a用索引,c不用。
【面试官手记】
小张这场面试的亮点:
知道十大索引失效原因
知道最左前缀原则
能说出具体的SQL改写方法
索引失效是P6工程师必备知识点,能完整回答的候选人,说明有数据库调优经验。
索引失效的核心是理解原理 + 避免踩坑。记住三个要点:
- 独立列原则:索引列不能参与运算,不能加函数
- 最左前缀原则:联合索引必须从最左列开始
- 类型一致:字符串加引号,类型必须匹配
索引失效是生产环境最隐蔽的坑,Code Review必须重点检查。