mysql隐式类型转换的坑
今天遇到一个性能有问题的SQL,此前没有遇到过,非常奇葩,特此记录一下。
有一个表里包含一个int类型的brand_id,有索引。
当explain下面的SQL时发现扫描了全表,花费了100毫秒。
1 |
select brand_id from category where brand_id in (0,'1215') |
而当把SQL改为:
1 |
select brand_id from category where brand_id in (0,1215) |
或者
1 |
select brand_id from category where brand_id in ('0','1215') |
都可以走索引,时间不到1毫秒。
IN中都是字符串或者都是整形,都可以走索引,而混合的情况就扫全表,什么情况?
问了一下DBA同学,在混合类型的情况下,mysql就不会对输入值进行隐式类型转换了,因此无法走int类型的索引检索。而当它们都是字符串的时候是会对输入值隐式转换为int并走索引进行检索。
知乎上有一点讨论,可以参考。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~

每次来都能学到知识,谢谢大神分享。
共同进步