temporary internet files PHP 中執行排序與 MySQL 中排序
此文首發在 InfoQ 中文站。作者:明靈(dragon) , Fenng . 註:要轉載的朋友請注意註明這篇文章的第一作者!
這篇文章是dragon 朋友來郵探討後他做的一個總結。在 DB 中排序還是在 應用程式中排序是個很有趣的話題,dragon 第一份郵件中其實已經總結的很好了,我添加了一點建議而已。現在放上來,與大家共享。這篇文章也投稿到了 InfoQ 中文站 。
Q:列出在 PHP 中執行排序要優於在 MYSQL 中排序的原因?給一些必須在MYSQL中排序的實例?
A:通常來說,執行效率需要考慮CPU、記憶體和硬碟等的負載情況,假定MYSQL 伺服器和PHP 的伺服器都已經按照最適合的方式來配置,那麼系統的可伸縮性(Scalability)和使用者感知效能(User-perceived Performance)是我們追求的主要目標。在實際運作中,MYSQL 中資料往往以 HASH tables、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。具體選擇,將取決於具體的應用。
列出一些 PHP 中執行排序較優的情況:
- 1、 資料來源不在 MYSQL 中,存在硬碟、記憶體或網路的請求等;
- 2、 資料存在 MYSQL 中,量不大,而且沒有對應的索引,此時把資料取出來用PHP排序比較快;
- 3、 資料來源來自多個 MYSQL 伺服器,此時從多個 MYSQL 中取出數據,然後在PHP中排序更快;
- 4、 除了MYSQL 之外,還有其他資料來源,例如硬碟、記憶體或來自網路的請求等,此時不適合將這些資料存入MYSQL 後再排序;
列出一些必須在MYSQL 中排序的實例:
- 1、 MYSQL 中已經存在這個排序的索引;
- 2、 MYSQL 中資料量較大,而結果集需要其中很小的一個子集;例如 1000000 行數據,取TOP 10;
- 3、 對於一次排序、多次呼叫的情況,例如統計聚合的情形,可以提供給不同的服務使用,那麼在 MYSQL 中排序是首選的。另外,對於資料深度挖掘,通常做法是在應用層做完排序等複雜操作,把結果存入MYSQL即可,方便多次使用。
- 4、 不論資料來源來自哪裡,當資料量大到一定的規模後,由於佔用記憶體/Cache 的關係,不再適合PHP 中排序了;此時把資料複製、匯入或存在MYSQL ,並用INDEX 優化,是優於PHP 的。不過,用 Java,甚至 C++ 來處理這類操作會更好。 [有些類似大數據集聚合或彙總的數據,在客戶端排序得不償失。當然,也有用類似搜尋引擎的想法來解決類似應用程式的情況。 ]
從網站整體考慮,就必須加入人力和成本的考慮。假如網站規模和負載較小,而人力有限(人數和能力都可能有限),此時在應用層(PHP)做排序要做不少開發和調試工作,耗費時間,得不償失;不如在DB 中處理,簡單快速。對於大規模的網站,電力、伺服器的費用很高,在系統架構上精打細算,可以節約大量的費用,是公司持續發展之必要;此時如果能在應用層(PHP) 進行排序並滿足業務需求,盡量在應用層進行。
以上就介紹了temporary internet files PHP 中執行排序與 MySQL 中排序,包括了temporary internet files方面的內容,希望對PHP教程有興趣的朋友有所幫助。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。
