2017-09-17 192 views
0

我通過UNION或UNION ALL從多個表中選擇一列外鍵。UNION vs UNION ALL的性能

當重複項無關緊要時,通常建議使用UNION ALL而不是UNION來解決性能問題。但是,在我調用PHP腳本時,循環並操作數據而不重複會更高效。

所以,我可以使用下列選項之一:

選項1:

使用UNION數據庫,以消除重複

選項2:

使用UNION ALL在數據庫中,並使用array_unique()或其他類似的函數消除我的PHP腳本中的數據。

我的假設是,在大多數情況下,選項1將是首選和更有效的方法,但我沒有什麼可以支持該假設,並且不確定測試它的最佳方法,尤其是因爲它可能取決於很多數據是。

在大多數情況下,我的假設是否正確?如果是這樣,爲什麼?如果不是,爲什麼不呢?

+0

測試兩個選項,你會看到。 – Shadow

+0

答案是,這取決於。測試兩者以找出答案。 –

+0

@TimBiegeleisen您將此鏈接作爲副本鏈接,但是,該頁面上沒有任何內容可以回答我的問題。它只是重申了我在我的問題中已經提到的內容。 – kojow7

回答

1

的主要方面是,UNION是快捷方式UNION DISTINCT等

ALL都涉及到
在UNION和UNION之間的性能差異需要獲得不同的結果,並且這種情況的數據庫引擎和查詢優化器 肯定比基於應用程序中的PHP代碼的filtring alogoritm更有效和最有效。

的dictinct操作可以,而且,通過功能從預先優化的集團利益

不僅,重複數據過濾通常是基於有序數據 而選擇SQL函數工作,沒有明確的排序, 因此需要使用應用程序過濾數據可能會導致效率降低,查詢時間變長。

一般的數據庫引擎是非常有效的應用PHP函數代碼,以便選擇1是一般越好的choise

1

速度的角度來看,它是相對微不足道。完成所有SELECTs的努力不僅僅是去做重複的工作,無論哪種方式。

因此,我建議您說UNION DISTINCT,因爲那是您的幾個擊鍵比array_unique(...)

其他注意事項:

  • UNION ALL將鏟更多的東西從服務器到客戶端;這(在極端或遙遠的情況下)可能是性能的一個因素。
  • 如果您還在UNION上表示ORDER BY,那麼您也可以使用DISTINCT
  • GROUP BY(在UNION上)具有DISTINCT的效果。
  • 如果您正在談論數百萬行,請記住PHP可以達到數組的內存限制,而MySQL本質上是無限的。
+0

你能解釋UNION和UNION DISTINCT的區別嗎?我認爲UNION自動做了DISTINCT。 – kojow7

+0

'UNION'與'UNION DISTINCT'是同義詞。我建議你總是拼寫出來,以便你(1)考慮要做哪些事情,以及(2)你告訴下一個讀者SQL(可能是你6個月)你做出了有意識的決定。 –