PHP 中執行排序與 MySQL 中排序

此文首發在 InfoQ 中文站做者:明靈(dragon) , Fenng . Note:要轉載的朋友請注意註明這篇文章的第一做者!
這篇文章是dragon 朋友來郵探討後他作的一個總結。在 DB 中排序仍是在 應用程序中排序是個頗有趣的話題,dragon 第一份郵件中其實已經總結的很好了,我添加了一點建議而已。如今放上來,與你們共享。這篇文章也投稿到了 InfoQ 中文站數據庫

Q:列出在 PHP 中執行排序要優於在 MYSQL 中排序的緣由?給一些必須在MYSQL中排序的實例?

A:一般來講,執行效率須要考慮 CPU、內存和硬盤等的負載狀況,假定 MYSQL 服務器和 PHP 的服務器都已經按照最適合的方式來配置,那麼系統的可伸縮性(Scalability)和用戶感知性能(User-perceived Performance)是咱們追求的主要目標。在實際運行中,MYSQL 中數據每每以 HASH tables、BTREE 等方式存貯於內存,操做速度很快;同時 INDEX 已經進行了一些預排序;不少應用中,MYSQL 排序是首選。而在應用層(PHP)中排序,也必然在內存中進行,與 MYSQL 相比具備以下優點:服務器

  • 一、 考慮整個網站的可伸縮性和總體性能,在應用層(PHP)中排序明顯會下降數據庫的負載,從而提高整個網站的擴展能力。而數據庫的排序,實際上成本是很是高的,消耗內存、CPU,若是併發的排序不少,DB 很容易到瓶頸。
  • 二、 若是在應用層(PHP)和MYSQL之間還存在數據中間層,合理利用,PHP會有更好的收益。
  • 三、 PHP在內存中的數據結構專門針對具體應用來設計,比數據庫更爲簡潔、高效;
  • 四、 PHP不用考慮數據災難恢復問題,能夠減小這部分的操做損耗;
  • 五、 PHP不存在表的鎖定問題;
  • 六、 MYSQL中排序,請求和結果返回還須要經過網絡鏈接來進行,而PHP中排序以後就能夠直接返回了,減小了網絡IO。

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

列出一些 PHP 中執行排序更優的狀況:

  • 一、 數據源不在 MYSQL 中,存在硬盤、內存或者來自網絡的請求等;
  • 二、 數據存在 MYSQL 中,量不大,並且沒有相應的索引,此時把數據取出來用PHP排序更快;
  • 三、 數據源來自於多個 MYSQL 服務器,此時從多個 MYSQL 中取出數據,而後在PHP中排序更快;
  • 四、 除了 MYSQL 以外,存在其餘數據源,好比硬盤、內存或者來自網絡的請求等,此時不適合把這些數據存入 MYSQL 後再排序;

列出一些必須在 MYSQL 中排序的實例:

  • 一、 MYSQL 中已經存在這個排序的索引;
  • 二、 MYSQL 中數據量較大,而結果集須要其中很小的一個子集;好比 1000000 行數據,取TOP 10;
  • 三、 對於一次排序、屢次調用的狀況,好比統計聚合的情形,能夠提供給不一樣的服務使用,那麼在 MYSQL 中排序是首選的。另外,對於數據深度挖掘,一般作法是在應用層作完排序等複雜操做,把結果存入MYSQL便可,便於屢次使用。
  • 四、 不論數據源來自哪裏,當數據量大到必定的規模後,因爲佔用內存/Cache 的關係,再也不適合 PHP 中排序了;此時把數據複製、導入或者存在 MYSQL ,並用 INDEX 優化,是優於 PHP 的。不過,用 Java,甚至 C++ 來處理這類操做會更好。 [有些相似大數據集聚合或者彙總的數據,在客戶端排序得不償失。固然,也有用相似搜索引擎的思路來解決相似應用的狀況。]

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

相關文章
相關標籤/搜索