1、如果你的表字段类型是字符串类型,比如varchar,并且该字段上有索引,如果你查询的时候用的是数值,则会导致索引失效,比如表里存的是:
字段 | user_id |
值 | 111 |
类型 | varchar(100) |
如果你的查询是select * from xxx where user_id=111,则索引失败; select * from xxx where user_id="111"才会用上索引。
因为mysql会在背后进行类型隐式转换(CONVERT_IMPLICIT),会把user_id隐式转换成浮点数,然后再跟你的111进行比较,然而你的索引是建在user_id上的,并不是在转换后的user_id上的,所以转换后的user_id上是没有索引的,会有效率问题。
再者,mysql的隐式转换string到number会有很多情况,比如"111"," 111","111a"都会转成111,case太多。
2、但如果你的表字段是数值类型则没关系,都会用到索引。
因为int再怎么转string都是固定的,不会出现像string转int的那么多case。
如果比较的两边是字符串和数字,则都会按浮点数进行比较。啥意思呢?
对于问题1,我们是user_id是varchar类型,值是int类型,这俩比的时候会把所有的varchar记录都转化成数字进行比较,
对于问题2,我们的user_id是int类型,值是string类型,这俩比的时候只会把值进行数字化,然后与记录中的数字进行比较,所以永远都会用到索引。
场景:https://makandracards.com/makandra/14955-mysql-will-not-use-indexes-if-you-query-the-wrong-data-type