2012-05-22 30 views
2

在mysql中,當你有3個表(大量數據)通過JOIN子句連接時,在SELECT的末尾有一個LIMIT子句,sql引擎產生表的笛卡爾乘積,這適用LIMIT之後,還是存在之前做過的任何優化?使用JOIN子句的LIMIT行爲

我在問,因爲如果我們使用大數據量JOIN操作是一個昂貴的操作。

在這種情況下,最好做JOIN並拉出所有數據,或者做SELECT WITH LIMIT子句N次?

+0

Mysql不會獲取比生成結果集所需的更多數據。因此,如果可能的話 - 它只讀取「LIMIT」行數量 – zerkms

+0

另一方面,有些事情*可能*會阻止MySQL提前終止 - 例如ORDER BY *可以*強制整個RS首先被實現,因爲LIMIT是一個「查看操作」。 – 2012-05-22 22:56:27

+0

@pst:不是那麼明顯 - 因爲'ORDER BY'可能使用索引 – zerkms

回答

0

不,限制功能只是一種視覺後續效果。

1/JOINS計算。

2 /在WHERE過濾器以及在HAVING濾波器處理

3 /所述LIMIT減少返回的結果的數量。如果您指定了任何ORDER BY子句,訂單仍然保留。

改善您的連接以改善計算開銷。

+0

你爲什麼這麼認爲? – zerkms

+0

由於要減少開銷,您必須減少行掃描。限制功能不會阻止掃描,因爲解析器仍然必須計算所有內容以瞭解它必須「限制」的內容。使用WHERE子句來減少開銷。 – Sebas

+1

「仍然必須計算一切,以瞭解它有什麼」限制「」 - 這是錯誤的。只要獲得了「LIMIT N」行,mysql就可以返回這些行 – zerkms

1

短版:這取決於查詢

加長版:當你有一個LIMIT子句,它假設你有數據訂購某種方式。如果您沒有明確指定ORDER BY子句,您會看到,只要MySQL找到所需的行數,查詢的執行就會停止。如果你有一個需要文件排序的命令,所有的數據將被排序在一個臨時表中,MySQL將輸出你指定的前N行。

但是,如果你強制特定的連接順序和索引使用情況,MySQL會愉快地縮短執行時間。

+0

好的,這是有道理的,因爲索引通常具有某種順序,自動增量,日期等等。因此,如果我使用WHERE子句並且不強制mysql引擎進行排序,則可以完成內部優化 –