2010-09-01 63 views
22

我想知道在性能方面,如果考慮mysql在非常非常非常非常非常非常多(> 1.000.000)記錄的表上選擇,使用sql「order by」更好地排序結果,或者在使用經典編程排序算法...有人有什麼建議嗎?是PHP排序比mysql「order by」更好?

坦克

+1

看起來你不知道數據庫是什麼。你可能認爲它不是像純文本文件那樣簡單的容器。它是數據處理軟件。設計用於訂購,過濾,聚合等等。雖然PHP不是數據處理軟件,但是超文本預處理器 – 2010-09-01 19:00:18

回答

14

你比較優化的C語言實現的方法的系統,意在做的正是這個任務,另一個,你會在一個解釋腳本來實現。

基本上,用C寫的東西將是一個很大的速度比PHP編寫的同等功能,通過10倍至100

如前所述,毫無疑問,在所有它遠更有效地配置您的數據庫並讓它完成工作。

20

mySQL,手下。它已經過優化,可以使用索引。這在PHP中會很糟糕(你會很快達到memory_limit)。

10

在你實際上是在你的應用程序的內存獲得記錄的假設情況那麼MySQL仍然會打敗你的應用程序的褲子,因爲如果你配置了數據庫權不會有排序。

我想要在1張Mio記錄的表中排序,您可以在索引中提供這個索引,該索引通常以B-Tree的形式實現,其中Mysql可以遍歷並獲取排序結果。

10

MySQL將獲勝。除了列出的其他理由之外,還有一個理由是,假設記錄已經存在於數據庫中,則不必將它們從數據庫中複製出來進行排序。並且分頁或分頁索引將會很容易並自動進行優化。

總之,如果數據庫可以做到這一點,數據庫應該這樣做,幾乎總是。

+2

+1 - 傳輸數據進行排序將比在數據庫上執行排序要昂貴得多。 – 2010-09-01 18:24:09

3

有時候,如果你可以避免「使用臨時;使用filesort」這是值得的,但我沒有做過廣泛的測試。

1 SIMPLE favorites ref source_id,user2_id source_id 3 const 137 Using index; Using temporary; Using filesort 
1 SIMPLE users eq_ref PRIMARY,updated PRIMARY 3 apm.favorites.target_id 1 Using where 

不要問mysql的以按名稱排序的,在紅寶石我做

results.sort_by {|u| u.name.downcase} 

產生的MySQL查詢變得更加簡單:

1 SIMPLE favorites ref source_id,user2_id source_id 3 const 137 Using index 
1 SIMPLE users eq_ref PRIMARY,updated PRIMARY 3 apm.favorites.target_id 1 Using where 

當然你不會想如果您返回的行數超過了幾百行,請執行此操作。