強迫 mysql 照指定的順序 join

語法:
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, 取得資料不多。

留言

  1. Selective 是最重要的啦~~ SQLite 也可以利用統技資訊來減少這種問題 不過也不是很聰明就是了 所以是類似提供 unary + operator 這種東西來手動調整http://www.sqlite.org/optoverview.html

    回覆刪除

張貼留言

這個網誌中的熱門文章

(C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

熟悉系統工具好處多多

virtualbox 使用 USB 裝置