2009-06-05 90 views
3

我想知道在MySQL或PHP或Python之類的服務器語言中處理數據是否更快。我敢肯定,原生功能,如訂單將會在MySQL更快,因爲索引,緩存等,但實際計算排名(含並列返回多個條目具有相同等級):用於處理數據的MySQL vs Web服務器

樣品SQL

SELECT TORCH_ID, 
    distance AS thisscore, 
    (SELECT COUNT(distinct(distance))+1 FROM torch_info WHERE distance > thisscore) AS rank 
    FROM torch_info ORDER BY rank 

服務器

...而不僅僅是做一個SELECT TORCH_ID FROM torch_info ORDER BY score DESC然後找出Web服務器上的PHP排名。

回答

1

對於大多數非複雜計算,MySQL可能會更快。然而,90%的時間數據庫服務器是瓶頸,所以你真的想要通過這些計算讓數據庫陷入困境而增加這一點嗎?我自己寧願把它們放在網絡/應用程序服務器上以平衡負載,但這是你的決定。

1

計數的速度將取決於您正在使用的數據庫存儲引擎和表的大小。儘管我懷疑在mySQL中幾乎所有的計數和排名都會比將相同的數據放入PHP內存並執行相同的操作更快。

+0

正如我在原來的職位說,COUNT是肯定會更快,因爲它是一個本地的SQL函數和我猜的DB將進行優化,以執行它。但是,排名不是本地函數。我的問題是詢問這些非本地函數在MySQL中是否更快,或者是像專門爲列表工作的say python這樣的語言。 – Karan 2009-06-05 18:20:41

0

排名是基於計數,秩序。所以如果你能更快地完成這些功能,那麼等級顯然會更快。

0

問題的很大一部分依賴於您設置的主鍵和索引。 假設torchID已正確索引...

您會發現mySQL比服務器端代碼更快。

您可能想要做的另一個考慮是該SQL將被調用的頻率。您可能會發現創建排列列更容易,並且在每個記錄進入時更新它。這會導致數據庫中出現很多次要的命中,而數據庫的命中次數較多。

假設您有10,000條記錄,每天有一千個用戶點擊此查詢,並且每天有100個用戶輸入新的跟蹤記錄。我寧願讓數據庫進行100次更新,其中10%擊中每條記錄(9,999次),然後讓排名查詢每天擊中1,000次。

我的兩分錢。

0

如果您的測試運行的是單個查詢而不是發佈事務,那麼我會建議在ODBC dsn上使用JDBC驅動程序,因爲您的性能會提高2-3倍。 (假設你在你的測試中使用了odbc dsn)

2

通常,「我應該在數據庫中處理數據還是在Web服務器問題上」的答案是「取決於」。

  1. 很容易添加另一個Web服務器。添加另一臺數據庫服務器比較困難。如果您可以從數據庫中卸載,那可能很好。
  2. 如果數據處理的輸出遠小於所需的輸入,則可以通過在數據庫中執行處理來避免大量的數據傳輸開銷。舉個簡單的例子,SELECT *,檢索表中的每一行,然後在Web服務器上遍歷它們以選擇x = 3的那一行,這是愚蠢的,當你只需要SELECT * WHERE x = 3
  3. 正如你指出的那樣,數據庫操作優化其數據,使用索引等