在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)也能達到顯式轉換的效果,當然顯式轉換也可能索引失效,這要取決于轉換發生在哪一側,可以多嘗試一下。
總之,我們在建表的時候,一定要考慮字段類型,避免常用字段連接查詢的時候發生隱式轉換。