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

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

最近调试插件后台时发现个诡异现象:明明加了索引的字段,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做专门搜索

评论16
回复 · 16
FinnSnow
FinnSnow 初级 · #16 ·
同求,期待更新
🐱汽水🎐
🐱汽水🎐 新手星灿心语 · #15 ·
感谢分享!
懒懒的汽水
懒懒的汽水 初级 · #14 ·
同求,期待更新
安静的橙子
安静的橙子 初级赏金猎人 · #13 ·
同求,期待更新
予安
予安 初级 · #12 ·
感谢分享!
迷路的橙子
迷路的橙子 新手番响心动 · #11 ·
学到了,顶一下
Ivy
Ivy 初级 · #10 ·
已解决,谢谢楼主
自由的骑士
自由的骑士 初级 · #9 ·
写得很清楚,收藏了
Paul
Paul 新手 · #8 ·
支持了~
SkyWalker
SkyWalker 新手璃海华章 · #7 ·
支持了~
刘磊
刘磊 新手 · #6 ·
支持了~
小鹿
小鹿 初级赏金猎人 · #5 ·
学到了,顶一下
CoolKid
CoolKid 新手漫步繁花 · #4 ·
感谢分享!
周鑫欣
周鑫欣 初级赤羽栖云 · #3 ·
感谢分享!
孙婷勇
孙婷勇 初级赏金猎人 · #2 ·
学到了,顶一下
IrisWave
IrisWave 新手漫步繁花 · #1 ·
已解决,谢谢楼主
微信客服 微信客服