在mysql中,當你有3個表(大量數據)通過JOIN子句連接時,在SELECT的末尾有一個LIMIT子句,sql引擎產生表的笛卡爾乘積,這適用LIMIT之後,還是存在之前做過的任何優化?使用JOIN子句的LIMIT行爲
我在問,因爲如果我們使用大數據量JOIN操作是一個昂貴的操作。
在這種情況下,最好做JOIN並拉出所有數據,或者做SELECT WITH LIMIT子句N次?
在mysql中,當你有3個表(大量數據)通過JOIN子句連接時,在SELECT的末尾有一個LIMIT子句,sql引擎產生表的笛卡爾乘積,這適用LIMIT之後,還是存在之前做過的任何優化?使用JOIN子句的LIMIT行爲
我在問,因爲如果我們使用大數據量JOIN操作是一個昂貴的操作。
在這種情況下,最好做JOIN並拉出所有數據,或者做SELECT WITH LIMIT子句N次?
短版:這取決於查詢
加長版:當你有一個LIMIT子句,它假設你有數據訂購某種方式。如果您沒有明確指定ORDER BY子句,您會看到,只要MySQL找到所需的行數,查詢的執行就會停止。如果你有一個需要文件排序的命令,所有的數據將被排序在一個臨時表中,MySQL將輸出你指定的前N行。
但是,如果你強制特定的連接順序和索引使用情況,MySQL會愉快地縮短執行時間。
好的,這是有道理的,因爲索引通常具有某種順序,自動增量,日期等等。因此,如果我使用WHERE子句並且不強制mysql引擎進行排序,則可以完成內部優化 –
Mysql不會獲取比生成結果集所需的更多數據。因此,如果可能的話 - 它只讀取「LIMIT」行數量 – zerkms
另一方面,有些事情*可能*會阻止MySQL提前終止 - 例如ORDER BY *可以*強制整個RS首先被實現,因爲LIMIT是一個「查看操作」。 – 2012-05-22 22:56:27
@pst:不是那麼明顯 - 因爲'ORDER BY'可能使用索引 – zerkms