2011-03-02 28 views
3

我有一種強烈的感覺,那就是查詢本身不需要的所有數學操作都應該在查詢之外執行。例如:MySQL優化:在查詢內部或外部執行數學運算?

$result = mysql_query(SELECT a, a*b/c as score FROM table) 
while ($row = mysql_fetch_assoc($result)) 
{ 
    echo $row['a'].' score: '.$row['score'].<br>; 
} 

VS:

$result = mysql_query(SELECT a, b, c FROM table) 
while ($row = mysql_fetch_assoc($result)) 
{ 
    echo $row['a'].' score: '.$row['a']*$row['b']/$row['c'].<br>; 
} 

第二個選項通常會比較好,尤其是複雜的表連接&這樣。這是我的懷疑,我只是缺乏確認。 。 。

+0

測試確認 – bensiu 2011-03-02 19:19:15

+0

我正在測試一個特定的實例,我想知道一個更普遍的趨勢 - 也許是這種情況的原因。 。 。 – jisaacstone 2011-03-02 19:22:25

回答

1

我的感覺是,在數據庫中做數學會從長遠來看會更有效,因爲您的查詢的設置。使用select a,b,c版本,PHP必須創建3個元素併爲獲取的每一行填充它們。

隨着研究的數據庫版本,僅創建2個元素,讓你由33%削減創建時間。無論哪種方式,計算必須完成,所以沒有太多的節約方式。現在

,如果你真的需要bc值暴露在你的代碼,那麼會是在數據庫中做的計算沒有意義的,你會增加更多的領域,結果與他們集服務員創建/處理/填充開銷。

不管,但是,你應該基準兩者的版本。在某種情況下有效的可能比在另一種情況下無用的情況更糟糕,只有一些測試會顯示哪個更好。

1

我同意一般。在查詢中從源數據中提取數據,處理調用/腳本環境中的數據。

除非您的查詢變得非常複雜,否則我不會過分擔心效率/速度,但它似乎仍然是正確的做法。

-1

我懷疑它可能是一個瓶頸。
尤其是複雜的表連接&例如,其中一個文件排序將結果這些數學由1000

然而因子,你可以隨時與BENCHMARK關鍵字perpend查詢並進行一些測量

BENCHMARK 1000 SELECT a, a*b/c as score FROM table 
0

如果有任何一種方式的性能優勢都可能會忽略不計,使其成爲優化問題而非優化問題。

我寧願它在查詢,個人,因爲我覺得它封裝在數據層計算。

此外,雖然它不適用於您的具體示例,但您向數據庫引擎提供的有關您最終嘗試執行的操作的信息越多,提供給查詢優化器的信息就越多。從理論上講,如果將計算放在SQL中,查詢實際上可能運行得更快。

1

數學在查詢中一般不會有問題,除非是在WHERE子句。例如:

SELECT a, b, c FROM table WHERE a*b=c 

這使得使用索引變得相當不可能。

SELECT a*b/c FROM table 

很好。

+0

好點,雖然不適用於OP問題。 – 2011-03-02 19:37:20

0

在數據庫中做它會更好,因爲您可以在一臺機器上運行應用程序,在另一臺機器上運行數據庫,也就是說,我會平衡您的整體性能。特別是在廉價的託管服務中,他們通常這樣做,在另一個機器數據庫中應用。

1

更快取決於所涉及的機器,如果你正在談論更快的一個用戶。如果您談論的是百萬用戶擊中網站的速度更快,那麼使用PHP進行這些計算會更有效率。

運行PHP的web服務器的負載很容易分佈在大量的機器上。這些機器可以並行運行,處理來自訪問者的請求並從數據庫中獲取必要的信息。但是,數據庫並不容易並行運行。複製或分片等問題非常複雜,需要專業軟件和正確組織的數據才能正常運行。與將另一個PHP安裝添加到服務器陣列相比,這些是昂貴的解決方案。

因此,數據庫機器上的CPU週期值遠遠高於Web服務器上的CPU週期值。所以你應該在網絡服務器上執行這些數學函數,其中CPU週期更便宜並且更容易並行化。

這還假定數據庫在執行計算時未保持打開任何類型的數據鎖定。如果是這樣,那麼你不僅僅使用寶貴的CPU週期,而是直接鎖定來自其他用戶的數據。