欢迎来到程序员中文网!

首页 Linux Mysql C++ Python PHP JavaScript 资源下载 动态 开源推荐
我要投稿 投诉建议

MySQL 索引失效的 8 种常见场景

时间:2026年08月12日 04:46:50 浏览:1

索引失效总结


即使建立了索引,SQL 写法不当也会导致全表扫描。


1. 使用函数或计算


-- 错误:导致索引失效
SELECT * FROM user WHERE YEAR(create_time) = 2025;

-- 正确:使用范围查询
SELECT * FROM user WHERE create_time >= '2025-01-01' AND create_time < '2026-01-01';

2. 隐式类型转换


-- phone 字段为 varchar,传入数字会导致类型转换
SELECT * FROM user WHERE phone = 13800138000; -- 索引失效

3. LIKE 以 % 开头


SELECT * FROM user WHERE name LIKE '%张三%';  -- 失效
SELECT * FROM user WHERE name LIKE '张三%'; -- 有效

4. OR 条件中部分字段无索引


-- 如果 age 无索引,整个查询走全表
SELECT * FROM user WHERE id = 1 OR age = 20;

5. 复合索引未遵循最左前缀


复合索引 (a, b, c),查询条件只有 bc 时失效。


6. != 或 <>


SELECT * FROM user WHERE status != 0;  -- 多数情况失效

7. 对索引列进行 NULL 判断


is null 可能有效,is not null 通常失效。


8. 数据分布不均


如果表中 90% 的数据满足条件,优化器可能选择全表扫描。


排查工具:使用 EXPLAIN 查看 type 是否为 ALLindex