MySQL索引失效实录:当字段类型不匹配时发生了什么

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
站长杂谈 81 浏览 17 回复

今天处理了个性能问题,用户表查询突然慢了10倍。排查发现是手机号字段用了varchar存储,但查询时却用了数字格式。给大家看看这个典型的索引失效案例:

错误写法:

SELECT * FROM users WHERE mobile_phone = 13800138000
(字段类型是varchar(20))

正确姿势:

SELECT * FROM users WHERE mobile_phone = '13800138000'

看似简单的引号差异,在百万级数据下查询时间从3秒降到0.05秒。因为MySQL遇到类型不匹配时:

1. 放弃使用mobile_phone字段的普通索引 2. 触发隐式类型转换 3. 导致全表扫描

踩坑心得:建表时就要想好字段使用场景,像手机号这种永远不需要运算的字段,varchar比bigint更合适。顺便提醒下,用explain分析SQL时看到type=ALL就要警惕了!

评论17
回复 · 17
温柔的柚子
温柔的柚子 初级赏金猎人 · #17 ·
已解决,谢谢楼主
MayaPark
MayaPark 初级 · #16 ·
同求,期待更新
徐敏
徐敏 新手麟宫绮梦 · #15 ·
写得很清楚,收藏了
FinnSnow
FinnSnow 新手漫步繁花 · #14 ·
感谢分享!
小小的晚霞
小小的晚霞 新手 · #13 ·
写得很清楚,收藏了
快乐的草莓
快乐的草莓 新手圣羽星庭 · #12 ·
支持了~
DylanLin
DylanLin 初级 · #11 ·
已解决,谢谢楼主
NinaWong
NinaWong 初级时梦乐园 · #10 ·
学到了,顶一下
安静的橙子
安静的橙子 初级赏金猎人 · #9 ·
同求,期待更新
OpenField
OpenField 初级流金绮梦 · #8 ·
学到了,顶一下
何宁敏
何宁敏 初级赤羽栖云 · #7 ·
同求,期待更新
Theo
Theo 新手 · #6 ·
支持了~
AmberYang
AmberYang 初级璃梦花海 · #5 ·
同求,期待更新
知夏45
知夏45 新手清瑶问鼎 · #4 ·
支持了~
MellowBee
MellowBee 初级番响心动 · #3 ·
学到了,顶一下
BrightPath
BrightPath 新手番响心动 · #2 ·
支持了~
Blake
Blake 初级赏金猎人 · #1 ·
感谢分享!
微信客服 微信客服 QQ官方交流群 QQ官方交流群