在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类型,转换之后就不会走索引了。
解决办法
- 修改表的字段类型,但往往这又涉及到代码的修改,工作量不可控,所以基本不会选择
- 使用显示转换,例如Select * from Orders o left join User u on CAST(u.id AS CHAR) = o.user_id
还有一个函数= CONVERT(CONVERT (u.id, CHAR) USING utf8)也能达到显式转换的效果,当然显式转换也可能索引失效,这要取决于转换发生在哪一侧,可以多尝试一下。
总之,我们在建表的时候,一定要考虑字段类型,避免常用字段连接查询的时候发生隐式转换。