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% 的索引都不会失效。

相关推荐
ShiXZ2131 小时前
Redis 常用指令全集:redis-cli 实战速查手册
数据库·redis·缓存
晓子文集2 小时前
Tushare接口文档:期货日线行情(fut_daily)
大数据·数据库·金融数据·量化投资·tushare
WA内核拾荒者2 小时前
WhatsApp 账号异常检测的自动化告警系统设计
数据库·python·自动化
龙仔7256 小时前
人大金仓OS_Core数据库自动备份实施笔记(银河麒麟Linux)
linux·数据库·笔记·备份·人大金仓
老杨聊技术6 小时前
CentOS 7 安装 MySQL 8 保姆级教程
linux·mysql·centos
sunxr.2276 小时前
Mysql-----最后一次作业
数据库·mysql
普通网友7 小时前
Python FastAPI 异步数据库管理
数据库·fastapi
晓子文集7 小时前
Tushare接口文档:期货合约信息表(fut_basic)
大数据·数据库·金融·金融数据·量化投资
三言老师7 小时前
CentOS7.9:Redis‑Cluster集群部署结构化实战教程
linux·运维·服务器·数据库
旺仔学长 哈哈8 小时前
Spring Boot 智能停车场管理系统---附源码+数据库文档
数据库·spring boot·后端·智能停车场