MySQL索引避坑指南:你建的索引可能根本没生效

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
插件开发 27 浏览 2 回复

最近调试插件后台时发现个诡异现象:明明加了索引的字段,EXPLAIN结果却显示全表扫描。排查后发现这几个索引失效场景特别容易被忽略:

1. 隐式类型转换导致失效 ```sql # 字段是varchar但用数字查询(常见于表单传参未校验) SELECT * FROM plugin_logs WHERE user_id = 10086 # 失效 SELECT * FROM plugin_logs WHERE user_id = '10086' # 有效 ```

2. 函数操作字段 ```sql # 生日查询场景 SELECT * FROM users WHERE YEAR(birthday) = 1990 # 全表扫描 SELECT * FROM users WHERE birthday BETWEEN '1990-01-01' AND '1990-12-31' # 走索引 ```

3. 最左前缀原则的坑 联合索引(a,b,c)的情况下: - WHERE a=1 AND b>2 → 用到a列 - WHERE b=2 → 完全失效 - WHERE a LIKE 'foo%' → 走索引 - WHERE a LIKE '%foo' → 失效

实战建议: 1. 定期用EXPLAIN验证慢查询 2. 字段类型与查询值严格一致 3. 避免在WHERE左侧使用函数 4. 联合索引注意顺序安排高频等值查询在前

遇到索引失效时,可以尝试: - 使用FORCE INDEX强制走特定索引 - 改用覆盖索引(查询字段全在索引中) - 必要时上ES做专门搜索

评论2
回复 · 2
孙婷勇
孙婷勇 新手赏金猎人 · #2 ·
学到了,顶一下
IrisWave
IrisWave 新手漫步繁花 · #1 ·
已解决,谢谢楼主
微信客服 微信客服