索引没被用上,先看这三件事
EXPLAIN 显示全表扫描,第一反应往往是加索引。但索引存在却不用,绝大多数是三个原因:查询条件类型和列类型不一致、条件列被函数包裹、或者隐式字符集转换。
类型不匹配最典型:列是 VARCHAR,参数传了数字,某些数据库会做隐式转换,转换后索引失效。日志里看不出区别,只有 EXPLAIN 能看见。
函数包裹是指 WHERE DATE(created_at) = '2026-10-01' 这种写法,索引建在 created_at 上,包一层函数就用不上了。改成范围条件即可。
隐式转换发生在字符集不同的列之间比较,比如 utf8mb4 和 latin1。这种问题在跨库查询时最常见,而且 EXPLAIN 有时不明确提示,需要看 warning。