MySQL索引失效实录:当字段类型不匹配时发生了什么
今天处理了个性能问题,用户表查询突然慢了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就要警惕了!
最新打赏

