当前位置: 首页 > news >正文

阿里、字节面试必问:MySQL 索引失效的 8 种场景,这次彻底搞懂!

前言

索引建了,查询却还是慢?90% 的可能是索引失效了。
阿里、字节面试官最爱问:你知道哪些情况会导致索引失效?怎么解决?
今天一文讲透 8 种索引失效场景,附实战案例 + 避坑指南,面试直接满分回答!🚀

为什么索引会失效?
一句话核心:索引失效的本质是破坏了 B+ 树的有序性。
当 MySQL 无法利用索引的有序结构快速定位数据时,就会放弃索引,走全表扫描。

下面这 8 种场景,就是面试官最爱挖的坑 👇

场景 1:模糊查询 LIKE 以 % 开头

sql
SELECT * FROM user WHERE name LIKE ‘%张’;
❌ 失效原因:% 在左边,字符串排序的“前缀”未知,无法利用 B+ 树的有序性。

✅ 解决方案:

尽量避免 % 开头,可考虑改用全文索引(MATCH AGAINST)

如果业务允许,改用 LIKE ‘张%’(范围查询,可走索引)

场景 2:对索引列使用函数或计算

sql
SELECT * FROM user WHERE YEAR(create_time) = 2026;
❌ 失效原因:索引存的是原始值,不是函数处理后的值。

✅ 解决方案:

改写成范围查询:
create_time BETWEEN ‘2026-01-01’ AND ‘2026-12-31’

如果必须用函数,考虑建立函数索引(MySQL 8.0.13+ 支持)

场景 3:隐式类型转换

sql
– phone 字段是 VARCHAR 类型,但查询条件是数字
SELECT * FROM user WHERE phone = 13800138000;
❌ 失效原因:MySQL 会将字符串隐式转换成数字,相当于对索引列用了 CAST(phone AS SIGNED),触发了函数操作。

✅ 解决方案:类型保持一致,数字加引号:
WHERE phone = ‘13800138000’

场景 4:联合索引不满足最左前缀

sql
– 联合索引 (a, b, c)
SELECT * FROM table WHERE b = 1 AND c = 2; – 没带 a
❌ 失效原因:B+ 树先按 a 排序,再按 b 排序,跳过 a 直接查 b,无法定位。

✅ 解决方案:

调整查询条件,带上最左列

或根据业务需求,新建以 b 开头的索引

场景 5:范围查询右边的列失效

sql
– 联合索引 (a, b)
SELECT * FROM table WHERE a > 1 AND b = 2;
❌ 失效原因:a 用了范围查询(>),导致 a 字段后面的 b 无法利用索引有序性。

✅ 解决方案:

将范围查询的字段放在联合索引的最后

如果业务无法调整,考虑对 b 单独建索引

场景 6:使用 OR 连接条件(两边不一定有索引)

sql
SELECT * FROM user WHERE id = 1 OR name = ‘张三’;
– 假设 id 有索引,name 无索引
❌ 失效原因:OR 只要有一边没索引,MySQL 就可能放弃索引,走全表扫描(除非用 UNION 优化)。

✅ 解决方案:

确保 OR 两边的字段都有索引

或改写成 UNION:

sql
SELECT * FROM user WHERE id = 1
UNION
SELECT * FROM user WHERE name = ‘张三’;

场景 7:使用 NOT、!=、<>

sql
SELECT * FROM user WHERE status != 1;
❌ 失效原因:不等值操作无法利用 B+ 树的等值查找特性,优化器通常认为全表扫描更快(除非数据分布极不均匀)。

✅ 解决方案:

如果业务允许,改为两个范围查询:status < 1 OR status > 1

如果这种查询很频繁,考虑用索引合并或重新设计索引

场景 8:IS NULL / IS NOT NULL 使用不当

sql
SELECT * FROM user WHERE name IS NOT NULL;
❌ 失效原因:IS NULL 在某些情况下可以走索引,但 IS NOT NULL 通常走不了(除非表中大部分数据都是 NULL)。

✅ 解决方案:

尽量避免对索引列使用 IS NOT NULL

如果业务需要,可以设置默认值(如空字符串 ‘’),然后用 = 查询

总结:索引失效速查表

场景 原因 解决
LIKE ‘%xxx’ 前缀未知 避免 % 开头,或用全文索引
对索引列用函数 无法利用有序值 改范围查询,或用函数索引
隐式类型转换 相当于用了函数 保持类型一致
不满足最左前缀 跳过联合索引左列 调整查询或新建索引
范围查询右边列 范围破坏有序性 范围字段放最后
OR 含无索引列 优化器放弃索引 两边建索引,或用 UNION
NOT、!=、<> 无法等值查找 改范围查询,或接受全表
IS NOT NULL 优化器认为慢 避免使用,用默认值代替
最后一句真理:索引失效,十有八九是因为你写的 SQL 让 B+ 树找不到北了。
下次写 SQL 前,先问自己一句:这列的数据现在是有序的吗? —— 答案一出,失效自破。

觉得有用?点个「收藏」,面试前翻出来看一遍,直接碾压面试官!🔥
评论区留下你遇到过的“奇葩”索引失效场景,大家一起避坑!👇

http://www.jsqmd.com/news/466137/

相关文章:

  • 如何让你的龙虾更智能
  • 【高清视频】介绍一个自动化测试辅助小工具 - 上下电测试适用于电脑冷启动的掉电盒
  • 新中地GIS开发特训营2505期正式结业|一份超全GIS开发学习内容清单请查收
  • openclaw配置免费千问模型
  • spring cloud eureka打包教程
  • 机器人设计与应用综合实训——ESP32开发技术分享3.11
  • 第19届CISCN_pwn_typo 小白初探
  • 自建docker镜像仓库
  • 一文搞懂 Spring 事务传播机制
  • 批量删除不连续固定行内容(含特定值)
  • 在Linux Mint上使用Qemu和Burp Suite进行Android模拟与流量拦截
  • TB 级 MySQL 5.7一主三从集群高可用实战记录:Orchestrator+ProxySQL方案
  • Webpack vs Vite
  • 从流量被动到AI引荐主动:2026年GEO实战架构与顶级优化
  • 2026年评价高的纯水加热器品牌推荐:PTC纯水加热器/在线纯水加热器/制绒清洗纯水加热器高口碑厂家推荐(评价高) - 行业平台推荐
  • 鼎跃安全丨太阳能航空障碍灯,守护电力高空设施与飞行安全
  • 2026年四川正规GEO优化公司TOP排名出炉,哪家能拔得头筹?
  • AI开发-python-langchain框架(3-4-pdf文件load()加载 )
  • 在python中的临时小知识
  • 免费ai绘画工具技术横评:功能、性能与架构分析
  • Windows 系统安全,从漏洞到后门那些事儿
  • 2026软考最全资料无偿分享
  • python数据容器快速回顾
  • 萧邦宝格丽百年灵|南京,上海,深圳等六大城市腕表养护维修指南,守护奢华质感与保值价值 - 时光修表匠
  • 不必焦虑,多数人没必要自己部署 OpenClaw
  • 海伯森发布高真空系列点光谱共焦传感头
  • 分析2026年实力强的美国投资移民企业,如何选择更明智 - 工业品网
  • Typecho 常见报错与修复大全(所有报错通用)
  • 前端中stylus是干嘛用的
  • 内外网文件交换系统产品推荐,Ftrans为企业跨网交互保驾护航