明明建了索引,查询还是慢,多数时候不是索引没用,而是写法让它失效了。下面三种是我实际遇到最多的。
第一种:对索引列套函数。函数作用在列上之后,MySQL 没法直接走索引的有序结构,只能全表逐行算:
-- orders 表在 created_at 上有索引
SELECT * FROM orders WHERE YEAR(created_at) = 2026; -- 对列套函数,索引用不上
SELECT * FROM orders
WHERE created_at >= "2026-01-01" AND created_at < "2027-01-01"; -- 改成范围条件,索引正常
第二种:LIKE 的前导通配符。百分号开头的模糊匹配没法利用索引的排序特性:
SELECT * FROM users WHERE name LIKE "%明"; -- 前面带百分号,全表扫描
SELECT * FROM users WHERE name LIKE "明%"; -- 后缀匹配,能走索引
第三种:隐式类型转换。列是字符串类型,比较值却写成数字,MySQL 会把整列转成数字再比,索引同样失效:
-- phone 列是 VARCHAR
SELECT * FROM users WHERE phone = 13800001234; -- 类型不匹配,索引失效
SELECT * FROM users WHERE phone = "13800001234"; -- 加上引号,索引正常
怀疑索引失效时,别猜,在语句前面加 EXPLAIN 看执行计划,type 列出现 ALL 就是在全表扫描,再回头对着上面三条改写法。