排序應該在數據庫仍是在應用程序中進行?

在網站開發中,到底是在數據庫(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)進行排序並知足業務需求,儘可能在應用層進行。
相關文章
相關標籤/搜索