明明建了索引,查询还是慢,多数时候不是索引没用,而是写法让它失效了。下面三种是我实际遇到最多的。

第一种:对索引列套函数。函数作用在列上之后,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 就是在全表扫描,再回头对着上面三条改写法。