不是 PHP 不行了,而是 MySQL 資料庫扛不住啊

来源:https://www.cnblogs.com/yxhblogs/p/18355860
-Advertisement-
Play Games

大多數的業務場景下 PHP 還沒有達到性能瓶頸,然而 MySQL 資料庫就先行駕崩了。但我們總是不分青紅皂白,一股腦的把原因歸結於是 PHP 語言不行了,每當遇到這種情形我就會感嘆到 PHP 的命真苦啊。 ...


大家好,我是碼農先森。

大多數的業務場景下 PHP 還沒有達到性能瓶頸,然而 MySQL 資料庫就先行駕崩了。但我們總是不分青紅皂白,一股腦的把原因歸結於是 PHP 語言不行了,每當遇到這種情形我就會感嘆到 PHP 的命真苦啊。PHP 作為一門優秀的開源編程語言,在編程語言界一直享有「PHP是世界上最好的語言」的美譽,它讓 PHP 靚仔們養了家糊了口過上了小康生活,但一遇到點性能問題就被瘋狂的吐槽,它真是幹了件吃力不討好的活。當然我相信這種吐槽是少數的,絕大數的人都還是會秉承理性公正的眼光來看待 PHP 語言,在碰到問題時會仔細分析緣由,找到問題的癥結並解決它,讓 PHP 綻放屬於它自己的光芒。

還記得在之前的工作經歷中,使用 ThinkPHP 框架開發公司內部的 ERP 後臺系統,很多的情況都是資料庫拖慢了用戶的訪問速度,比如開發的一些財務數據報表,這些介面往往都會聚合了好幾張數據表的數據,左連接一張表右連接一張表,動不動還搞個全連接,這能不慢嘛。不僅如此,還有在一個介面里 SQL 語句的查詢都嵌套了好幾層,各種子查詢漫天飛,這樣的代碼現狀簡直慘不忍睹,數據量小的時候尚且能用不會影響用戶的體驗,當數據量上來時介面就經常搞超時,資料庫的慢日誌都打滿了。在我印象中有個最深刻的例子,就是有一個速賣通的產品編輯功能,一個頁面需要能同時編輯幾十個產品,這就是所謂的批量編輯,而且每個產品的詳情數據特別多,還包括很多的圖片,每次載入這些數據和圖片就半天了,這個功能使用人數最多、使用次數最頻繁,同時也是被吐槽的最多的。如果有開發過類似功能的朋友,可能會有比較深刻的感觸。

還有一種用腳本跑非同步任務的場景,由於有些報表用介面是真的搞不出來了,那就用腳本的方式定時計算。但當時由於我們的數據量比較大,都是上百萬千萬級別的,單進程跑數據太慢,為了提升效率就直接幹上了 PHP 多進程。那時我們還滿心歡喜的 Fork 著進程,一啟動腳本就是併發幾十個進程,結果現實情況就是給我們當頭一棒,阿裡雲 MySQL 資料庫監控系接連報警,登上雲控制台一看傻眼了,CPU 直接乾到 100% 滿載運行,搞的 ERP 後臺系統都無法正常訪問了。還被技術老大當頭呵斥你們搞什麼飛機,嚇得我們趕緊通過 Kill 命令把腳本進程強制殺掉。說到這裡可能有些朋友會有些疑惑了,為什麼非同步腳本會影響到 ERP 後臺系統呢?原因是大多數的 PHP 靚仔們都有直接線上上環境修改代碼的習慣,當然這種事情在我們這裡也不例外了哈哈,甚至有時都變成了常態,感覺就是怎麼方便怎麼來。所有的業務都是共用一個資料庫,這不就影響到 ERP 後臺系統了嘛。

通過談我之前的經歷,可以看出並不是 PHP 不行,而是因為沒有正確的使用好 PHP 而把資料庫搞垮了,單純的責怪 PHP 語言本身沒有任何意義。很多時候性能的瓶頸,往往都是先在資料庫層面出現,比如某些查詢沒有命中索引、子查詢嵌套層數過多、長事務造成死鎖、併發大量的操作造成負載過高等等。總而言之,在我的經歷中把 PHP 語言乾出性能瓶頸的場景還是占少數,誇張點可以說幾乎沒有哈哈,可能是我資歷尚淺,不過話又說回來,大家的經歷和我的應該也差不多。最後希望大家可以在資料庫層面多花一些功夫,而不是糾結於這門語言到底行不行了,如果資料庫都不行了,那麼換什麼語言都是白瞎,願這一點大家能有相應的共識。本次的分享內容就到這裡結束了,希望對大家能有所啟發。

感謝大家閱讀,個人觀點僅供參考,歡迎在評論區發表不同觀點。


歡迎關註、分享、點贊、收藏、在看,我是微信公眾號「碼農先森」作者。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 寫在前面 今天繼續講JavaIO流的知識! Java 文件與流操作 File 類 File 類用於表示文件和文件夾的抽象。 構造方法 public File(String pathname): 使用路徑名創建 File 對象。 public File(String parent, String ch ...
  • 類中使用shared_ptr()的問題 當我們先定義一個指針,然後再用這個指針構造兩個智能指針 int main() { int* pt = new int(); std::shared_ptr<int> p1(pt); std::shared_ptr<int> p2(pt); std::cout ...
  • 先序: 學習編程語言要先學個輪廓,剛開始只用學核心的部分,一些細節、不常用的內容先放著,現用現查即可;把常用的東西弄熟練了在慢慢補充。 1、 安裝 Python 解釋器 為什麼需要安裝 Python Python 語言本身是由解釋器執行的,因此你需要在你的電腦上安裝 Python 解釋器。這個解釋 ...
  • 先序: 學習編程語言要先學個輪廓,剛開始只用學核心的部分,一些細節、不常用的內容先放著,現用現查即可;把常用的東西弄熟練了在慢慢補充。 1. Java 概述 Java 是一種面向對象的編程語言,由 Sun Microsystems(現在的 Oracle)在 1995 年推出。Java 程式可以在任何 ...
  • 正文 今天還是把周末的所有事情一起寫。每到周末都沒什麼寫日記的動力。 周五下午出去吃飯,吃一半,斯視頻突然打過來。我當時有點懵,不知道他要乾什麼,但還是接了。第一個畫面就是他擺弄自行車。他跟我說,自行車踏板和鏈條有問題,踩下去的時候轉一半就動不了了。 經過我們二人一通瞎猜,發現是後面的鏈條掉了,但是 ...
  • 1. Rust 簡介 Rust 的歷史 起源:Rust 語言最初由 Mozilla 研究員 Graydon Hoare 於 2006 年開始設計,並於 2009 年首次公開。 開發:Rust 是 Mozilla 實驗室的一個項目,目的是創建一種能夠保證記憶體安全同時又不犧牲性能的系統編程語言。 發佈: ...
  • 1. make 和 Makefile 1.1. 什麼是make? 1.2. 什麼是Makefile? 1.3. make 與 Makefile的關係 2. Makefile的語法 2.1. 基本語法 2.2. 變數 2.3. 偽目標 2.4. 模式規則 2.5. 自動變數 2.6. 條件判斷 3. ...
  • Torna —— 一款介面文檔解決方案,目標是讓介面文檔管理變得更加方便、快捷。採用團隊協作的方式管理和維護介面文檔,將不同形式的文檔納入進來統一維護。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...