MySQL在什么情况下会产生隐式转换
当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引。
下面分析两种隐式转换的情况:
EXPLAIN select * from user where uid = '2'
EXPLAIN select * from user where uid = 2
如果数据库的uid
字段是char或varchar,查询条件为数字类型,这时就会发生隐式转换:
不过,这时并没有太大影响,因为int
类型的数字2只能转化为'2',是唯一确定的。所以虽然有隐式转换,但不影响使用索引,不会导致慢查询。
所以说上面的例子中,两种情况都可以用到索引,也就是说,可以为所有的数字都加上引号,不会因为无法命中索引,导致慢查询。
负面的隐式转换
如果反过来,上面的例子中,uid 在数据库中不是字符串类型,而是数字类型,这时,执行语句:EXPLAIN select * from user where name= 2
,就可能出现 全表查询 的慢查询情况。
因为等号两侧类型不一致,会产生隐式转换,虽然查询条件仅为字符串 '2'
,但能转化为数字 2 的情况却很多;
比如'2',' 2','2abc'
,都会被转化成 2,故MySQL无法使用索引只能进行全表扫描,导致了慢查询的产生。
网友评论