[MySQL系列] 使用STRAIGHT_JOIN 優化inner join查詢排序索引問題
阿新 • • 發佈:2021-10-27
專案裡有條sql語句使用inner join 語句
但是在增加了order by 左表.欄位 desc 後效率非常慢
查詢explain 如下:
左表字段last_follow_time是有索引的,排序時但是並沒有走索引,出現了Using temporary; Using filesort
這是因為排序時沒有使用左表的欄位索引,我們可以強制使用左表作為主表,就可以使用索引了
STRAIGHT_JOIN 替換 inner join,就可以解決問題
總的來說STRAIGHT_JOIN只適用於內連線,因為left join、right join已經知道了哪個表作為驅動表,哪個表作為被驅動表,比如left join就是以左表為驅動表,right join反之。
而STRAIGHT_JOIN就是在內連線中使用,而強制使用左表來當驅動表,所以這個特性可以用於一些調優,強制改變mysql的優化器選擇的執行計劃。(也就是說STRAIGHT_JOIN實際上是INNER JOIN的強制指定左表作為驅動表,而不是讓mysql優化器去判斷和選擇)