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

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

今天处理了个性能问题,用户表查询突然慢了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就要警惕了!

评论1
回复 · 1
Blake
Blake 新手赏金猎人 · #1 ·
感谢分享!
微信客服 微信客服