SELECT STRAIGHT_JOIN ... FROM A, B, C ...這樣就會照 table 出現的順序 (即 A, B, C) join。若你很清楚怎麼 join 最省事, 用 STRAIGHT_JOIN 可以避免 mysql 猜錯順序造成超大 join。
我遇到的情況是需要用 primary key 分批取出 A 部份 rows 和 B, C, D 做 join, 再做些計算。這樣資料不會過大而無法處理。但交給 mysql 自行判斷時, 因為資料分佈的變化, mysql 有時選擇先 join B, C, D 最後才 join A, 但 join B, C, D 會造成大量 IO, 速度極慢。反之, 先取 A 部份的 rows 再往後 join, 取得資料不多。
Selective 是最重要的啦~~ SQLite 也可以利用統技資訊來減少這種問題 不過也不是很聰明就是了 所以是類似提供 unary + operator 這種東西來手動調整http://www.sqlite.org/optoverview.html
回覆刪除