扫盲 2026.10.06 07:38 37 次浏览 0 条评论

MySQL索引失效常见情况

索引建了不代表一定用得上,下面这几种情况,MySQL 直接就把索引扔了,走全表扫描。

对索引列做运算或者套函数,最典型。写成 WHERE id+1=5,索引直接废,得改成 WHERE id=4。字段上用函数也一样,比如 DATE(create_time)='2024-01-01',改成范围查询才行。

隐式类型转换。手机号字段是 varchar,你拿数字去查,MySQL 偷偷把列转成数字,索引就没了。字符串字段查询记得加引号。

like 开头带百分号,like '%张' 用不上索引,like '张%' 才行。

联合索引不遵守最左前缀。索引是 (a,b,c),你 where 里跳过 a 直接查 b,索引用不了。

or 两边有一边没索引,整个查询可能全表扫。用 union 拆开更快。

还有 !=、not in、is not null 这类,区分度低的时候优化器觉得全表扫更划算,也会主动放弃索引。

-- 索引失效
SELECT * FROM user WHERE phone = 13800000000;  -- phone 是 varchar,类型转换失效
SELECT * FROM user WHERE id + 1 = 100;         -- 列参与运算失效
SELECT * FROM user WHERE name LIKE '%三';      -- 前置百分号失效

-- 改成这样走索引
SELECT * FROM user WHERE phone = '13800000000';
SELECT * FROM user WHERE id = 99;
SELECT * FROM user WHERE name LIKE '张%';

排查的时候直接在 SQL 前面加 EXPLAIN,看 type 和 key 两列,key 是 NULL 就说明没走索引。

说点什么 0

行思随记

欢迎来到:行思随记