程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> PHP 中執行排序與 MySQL 中排序

PHP 中執行排序與 MySQL 中排序

編輯:關於MYSQL數據庫

在網站開發中,究竟是在數據庫(DB)中排序好,還是在應用程序中排序更優,這一直是個很有趣的話題。DBANotes.Net博主,在數據庫方面比較有研究的馮大輝就這一問題日前和讀者明靈(Dragon)做了探討,本文是關於該問題的總結。

問:請列出在PHP中執行排序要優於在MySQL中排序的原因?
答:通常來說,執行效率需要考慮CPU、內存和硬盤等的負載情況,假定MySQL服務器和PHP的服務器都已經按照最適合的方式來配置,那麼系統的可伸縮性(Scalability)和用戶感知性能(User-perceived Performance)是我們追求的主要目標。在實際運行中,MySQL中數據往往以HASHtables、BTREE等方式存貯於內存,操作速度很快;同時INDEX已經進行了一些預排序;很多應用中,MySQL排序是首選。而在應用層(PHP)中排序,也必然在內存中進行,與MySQL相比具有如下優勢:
1. 考慮整個網站的可伸縮性和整體性能,在應用層(PHP)中排序明顯會降低數據庫的負載,從而提升整個網站的擴展能力。而數據庫的排序,實際上成本是非常高的,消耗內存、CPU,如果並發的排序很多,DB很容易到瓶頸。
2. 如果在應用層(PHP)和MySQL之間還存在數據中間層,合理利用的話,PHP會有更好的收益。
3. PHP在內存中的數據結構專門針對具體應用來設計,比數據庫更為簡潔、高效;
4. PHP不用考慮數據災難恢復問題,可以減少這部分的操作損耗;
5. PHP不存在表的鎖定問題;
6. MySQL中排序,請求和結果返回還需要通過網絡連接來進行,而PHP中排序之後就可以直接返回了,減少了網絡IO。

至於執行速度,差異應該不會很大,除非應用設計有問題,造成大量不必要的網絡IO。另外,應用層要注意PHP的Cache設置,如果超出會報告內部錯誤;此時要根據應用做好評估,或者調整Cache。具體選擇,將取決於具體的應用。

問:請提供一些必須在MySQL中排序的實例?
答:在PHP中執行排序更優的情況舉例如下:
1. 數據源不在MySQL中,存在硬盤、內存或者來自網絡的請求等;
2. 數據存在MySQL中,量不大,而且沒有相應的索引,此時把數據取出來用PHP排序更快;
3. 數據源來自於多個MySQL服務器,此時從多個MySQL中取出數據,然後在PHP中排序更快;
4. 除了MySQL之外,存在其他數據源,比如硬盤、內存或者來自網絡的請求等,此時不適合把這些數據存入MySQL後再排序。
必須在MySQL中排序的實例如下:
1. MySQL中已經存在這個排序的索引;
2. MySQL中數據量較大,而結果集需要其中很小的一個子集,比如1000000行數據,取TOP10;
3. 對於一次排序、多次調用的情況,比如統計聚合的情形,可以提供給不同的服務使用,那麼在MySQL中排序是首選的。另外,對於數據深度挖掘,通常做法是在應用層做完排序等復雜操作,把結果存入MySQL即可,便於多次使用。
4. 不論數據源來自哪裡,當數據量大到一定的規模後,由於占用內存/Cache的關系,不再適合PHP中排序了;此時把數據復制、導入或者存在MySQL,並用INDEX優化,是優於PHP的。不過,用Java,甚至C++來處理這類操作會更好。

從網站整體考慮,就必須加入人力和成本的考慮。假如網站規模和負載較小,而人力有限(人數和能力都可能有限),此時在應用層(PHP)做排序要做不少開發和調試工作,耗費時間,得不償失;不如在DB中處理,簡單快速。對於大規模的網站,電力、服務器的費用很高,在系統架構上精打細算,可以節約大量的費用,是公司持續發展之必要;此時如果能在應用層(PHP)進行排序並滿足業務需求,盡量在應用層進行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved