MySQL 索引失效 12 大场景

这是开发、面试、SQL 优化最常考、最容易踩坑 的知识点,我直接给你最清晰、最实用、能直接对照代码的版本,遇到慢 SQL 一查就懂。


一、最常见:索引列上使用 函数 / 运算

只要对索引列做任何计算、函数处理,索引直接失效!

sql 复制代码
-- 索引失效
WHERE YEAR(create_time) = 2024
WHERE price + 1 = 100
WHERE LEFT(name,2) = '张'

-- 索引生效
WHERE create_time >= '2024-01-01'
WHERE price = 99
WHERE name LIKE '张%'

二、模糊查询 % 开头

sql 复制代码
-- 失效
WHERE name LIKE '%张三'
WHERE name LIKE '%三%'

-- 生效
WHERE name LIKE '张三%'

原因:% 在前无法使用 B+ 树有序匹配。


三、隐式类型转换(最容易忽略)

索引列是字符串,查询传数字 → 索引失效!

sql 复制代码
-- phone 是 varchar 索引列
WHERE phone = 13800138000   -- 失效(MySQL 做隐式转换)
WHERE phone = '13800138000' -- 生效

四、联合索引违反最左前缀原则

联合索引 (a,b,c)

sql 复制代码
WHERE b=?  -- 失效
WHERE c=?  -- 失效
WHERE a=? AND c=? -- 只命中 a,b 断层

五、使用 OR 但有一列没有索引

sql 复制代码
-- name 有索引,age 无索引 → 全表扫描
WHERE name='张三' OR age=20

OR 必须两边都有索引才会走索引。


六、判断 != / <> / NOT IN / NOT EXISTS

sql 复制代码
WHERE status != 1
WHERE id NOT IN (1,2,3)

大概率导致索引失效,优化器直接选择全表扫描。


七、判断 IS NOT NULL

sql 复制代码
WHERE name IS NOT NULL  -- 索引失效

IS NULL 可以走索引,IS NOT NULL 基本不走。


八、联合索引中,范围列后面的列无法命中

索引 (a, b, c)

sql 复制代码
WHERE a=1 AND b>10 AND c=100
  • a、b 命中索引
  • c 失效(因为 b 是范围查询,截断了)

口诀:范围之后,索引失效


九、ORDER BY 不符合索引规则

排序字段和索引顺序不一致 → 索引失效。

sql 复制代码
-- 索引 (a,b)
ORDER BY b        -- 失效
ORDER BY a DESC, b ASC -- 失效(混合排序)

十、数据量太少,优化器选择全表扫描

表只有几十行,MySQL 觉得全表扫描比走索引更快,直接放弃索引。


十一、使用 SELECT * 导致无法使用覆盖索引

sql 复制代码
SELECT * FROM user WHERE name='张三'

如果能写成覆盖索引,速度会快很多:

sql 复制代码
SELECT name FROM user WHERE name='张三'

十二、索引区分度太低

性别、状态(0/1)这种重复值极多的列,建了索引也不会用


最精简记忆版(面试直接背)

  1. 索引列函数、运算
  2. like %xx
  3. 隐式类型转换
  4. 联合索引最左前缀不匹配
  5. OR 有一列无索引
  6. != / not in / not exists
  7. is not null
  8. 范围查询后面列失效
  9. order by 不按索引
  10. 数据太少优化器放弃索引

总结

只要你写 SQL 时记住一句话:
不计算、不函数、不隐式转换、最左前缀不乱写,99% 的索引都不会失效。

相关推荐
我不是程序员三三1 小时前
如何监控电脑|企业终端行为监控概念科普与落地方法论
数据库·电脑·php
大牧师1 小时前
TypeORM 入门教程
后端·sql·mysql·orm·nest·typeorm
oliver_sys_log1 小时前
绕过 Yearning 查询体验限制:我做了一个 DataGrip 只读 SQL 代理
后端·mysql
lhldsg2 小时前
全民健身解决方案软件开发实战:从架构设计到部署指南
java·前端·数据库·小程序
我是大猴子2 小时前
线上耗时问题排查
数据库
小码过河.2 小时前
oceanbase中zone和observer、分区表之间关系
前端·数据库·oceanbase
其实防守也摸鱼2 小时前
OpenClaw Windows 踩坑实战指南
运维·服务器·数据库·windows·github·copilot
SelectDB2 小时前
Apache Doris+ Paimon 2.0:构建 Agentic AI 数据闭环
大数据·数据库·数据分析
麦聪聊数据3 小时前
全链路数据安全防护(中):入口、权限、审计,筑牢安全管控铁三角
数据库
山岚的运维笔记3 小时前
mysql 专业笔记 -- 第 17 章:连接:连接三个具有相同名称 ID 的表
运维·数据库·笔记·后端·学习·mysql·dba