MySQL索引优化之索引条件字段类型不同

在sql的联表查询中,on后面相等的两个字段如果字段类型不一致,尽管它们都加了索引,最终查询的时候也不会走索引,这是因为会触发隐式类型转换导致索引失效。

例如

Select * from Orders o left join User u on o.user_id = u.id;

假如Orders表中的user_id是varchar类型,而user表主键id是int类型,mysql会把o.user_id隐式转换为int类型,转换之后就不会走索引了。

解决办法

  1. 修改表的字段类型,但往往这又涉及到代码的修改,工作量不可控,所以基本不会选择
  2. 使用显示转换,例如Select * from Orders o left join User u on CAST(u.id AS CHAR) = o.user_id

还有一个函数= CONVERT(CONVERT (u.id, CHAR) USING utf8)也能达到显式转换的效果,当然显式转换也可能索引失效,这要取决于转换发生在哪一侧,可以多尝试一下。

总之,我们在建表的时候,一定要考虑字段类型,避免常用字段连接查询的时候发生隐式转换。