首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 百萬級高併發實戰攻略:從寫入瓶頸到檔案落地重構

     編輯:MySQL 資料庫相關知識

案例背景

  • 單日 PV 近 1 億,MySQL 單點寫入崩潰,統計系統全天零資料。
  • 團隊資源有限,排除叢集、分庫分表 (成本/技術門檻高)。

演進軌跡與失敗教訓

最終制勝方案:寫入檔案落地 + 異步批次入庫

核心架構

請求 → PHP error_log() 寫入本地檔案 (按小時+IP分片)
                          ↓
              離線處理腳本 (每小時/每日)
              1. 讀取檔案 → 去重/聚合 (同 IP 合併 PV)
              2. LOAD DATA INFILE 批次入庫 (秒級百萬行)
                          ↓
                   統計報表正常跑

關鍵技術細節

  1. 檔案命名: stats_2024011514_221.log (YYYYMMDDHH_IP前三段)。
  2. 寫入函數: error_log($line, 3, $file) — 系統級追加寫入、自動鎖定、效能極高。
  3. 去重邏輯: 同 IP 同 URL 合併計數,減少 90%+ 入庫行數。
  4. 入庫指令:
    LOAD DATA INFILE '/path/stats_2024011514_221.log'
    INTO TABLE stats
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    (`access_time`, `url_md5`, `ip`, `ua`);

效能對比

方案做法結果教訓
叢集MySQL Cluster / Galera否決成本高、技術債重
分庫分表按流量切 10 台低配機暫時緩解統計聚合痛苦、非長久
改寫寫入邏輯先查重再插 → 直接插入資料保住索引維護拖垮、後續處理仍死
移除索引寫入快、查詢極慢得不償失索引是查詢命脈,不可捨
指標直接 INSERT檔案落地 + LOAD DATA
寫入 QPS~500 (鎖爭用)~50,000+ (檔案追加)
入庫耗時 (百萬行)數小時< 30 秒
資料完整性高併發丟失零丟失 (檔案可重跑)

架構原則總結

  1. 寫入路徑極簡化: 不做查重、不做邏輯、只落地。
  2. 計算下沉離線: 複雜聚合移至批次腳本,不阻塞線上。
  3. 利用資料庫批次工具: LOAD DATA INFILE 是 MySQL 最高效入庫方式。
  4. 冪等設計: 檔案可重複處理,主鍵/唯一鍵保證冪等。

適用場景擴展

  • 日誌收集、點擊流、IoT 遙測、廣告曝光/點擊統計。
  • 任何「寫多讀少、允許秒級延遲」的高併發寫入場景。

解決資料庫瓶頸不一定要加硬體、換引擎、上叢集;**換個思路,把寫入變成順序追加檔案**,往往能以 1/10 成本獲得 100 倍吞吐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved