2013-07-04 97 views
2

在查詢像這樣:MySQL效率 - 在一次查詢中執行多次重複語句多次執行?

SELECT 
AVG(var1) AS var1_average, 
AVG(var2) AS var2_average, 
(
AVG(var1) + 
AVG(var2) 
)/2.0 AS total_average 
FROM readings 

做之類的語句AVG(VAR1)出現多次獲得多次執行,或者是他們更有效地內部緩存?

我的問題來自試圖理解性能/效率。將它作爲某種形式的子查詢寫起來會更好嗎?它會造成多大的差異?

+2

使用'EXPALIN'查看計劃並找出答案。 – Jodrell

+0

我不知道,但也許你可以試試。在查詢中添加幾百個這樣的語句,看看它是否有所作爲。 – GolezTrol

+0

添加幾百個肯定會有所作爲,但這可能只是解析查詢需要多長時間 – Kickstart

回答

1

嘗試之間的執行時間比較:

SELECT 
AVG(var1) AS var1_average, 
AVG(var2) AS var2_average, 
(
AVG(var1) + 
AVG(var2) 
)/2.0 AS total_average 
FROM readings 

和:

SELECT 
    (var1_average+var2_average)/2.0 AS total_average 
    var1_average, 
    var2_average 
FROM (
    SELECT 
     AVG(var1) AS var1_average, 
     AVG(var2) AS var2_average 
    FROM readings 
) as tmp 

確保運行它們多次,並添加SQL_NO_CACHE得到有意義的結果。

注: 第二個查詢應該有一個小的開銷,因爲MySQL會創建一個臨時表,但如果在readings表的很多記錄,這將是不相關的。

3

這是一個非常神祕的優化領域,即通用子表達式的優化。在你的例子中,它沒有什麼區別。 group by對數據進行排序,這比平均數量要貴得多。

還有其他的計算方法,比如count(distinct),這些計算都比較昂貴。在這種情況下,你的問題就會變得更加明顯。

斯蒂芬的解決方案比較子查詢可能工作得很好,在這種情況下。但是,子查詢本身會產生很多開銷,因爲它會創建一個臨時表。所以,你沒有比較蘋果和蘋果。

如果您真的想比較差異,請進行以下比較。比較查詢:

SELECT AVG(var1) AS var1_average, AVG(var2) AS var2_average, 
     (AVG(var1) + AVG(var2))/2.0 AS total_average 
FROM readings; 

要:

SELECT AVG(var1) AS var1_average, AVG(var2) AS var2_average 
FROM readings; 

您可能會發現,他們採取大約在同一時間。如果不是,您可能可以使用子查詢方法。或者您可能決定在應用程序級別進行平均計算。

+0

+1爲更清潔的方法:) – Stephan