首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

使用 Batch Insert 解決 MySQL INSERT 吞吐量瓶頸:原理、實測與最佳實踐

     編輯:MySQL 綜合教學

Batch Insert 提升 MySQL 寫入吞吐量:從 56 RPS 到 2040 RPS 的 36 倍飛躍

核心概念

  • IPS (Insert Per Second):每秒執行 INSERT 語句數。
  • RPS (Effective Rows Per Second):每秒實際寫入行數,**才是真正的吞吐量指標**。

Batch Insert 將多條 INSERT INTO t VALUES (v1); INSERT INTO t VALUES (v2); 合併為 INSERT INTO t VALUES (v1), (v2), ...;。

實測環境

  • 單欄 INT 表,10 萬筆資料,本地 Socket 連接,Shell 單進程。

實測數據對比

Values/批次耗時(秒)QPSRPS (吞吐量)
117775656
10531881,886
5049402,040
10050192,000
20051101,960
5005731,754
1,0006021,666
5,000690.31,449
10,0001330.07751

關鍵發現

  1. 單次 INSERT 開銷大:連線建立、權限驗證、語法解析、優化器分析等固定成本,與 VALUES 數量幾乎無關(Profile 顯示 1 個 vs 10 個 VALUES 耗時幾乎一致)。
  2. 存在「最佳批次大小」拐點:本測試 50 為最佳,RPS 峰值 2040,較單條提升 36 倍(耗時降 97%)。
  3. QPS 峰值 ≠ RPS 峰值:QPS 在 10 時最高,但 RPS 在 50 時最高,**優化目標應為 RPS**。
  4. 批次過大(>200)反而拖慢,因單條 SQL 過大導致解析/網路傳輸/緩衝區壓力上升。
  5. 生產落地建議:雙閾值觸發機制

    前端寫入緩衝隊列,滿足**任一條件**即觸發批次寫入:

    • 數量閾值: 累積 N 筆(建議 50~100,依表結構實測校準)。
    • 時間閾值: 等待 T 秒(建議 100~500ms),防止低峰期資料積壓過久。

    優點:高峰期走數量閾值達到高吞吐,低峰期走時間閾值保證實時性。

    Profile 對比證據

    -- 單 VALUES
    starting 0.000056, checking permissions 0.000010, Opening tables 0.000034, 
    System lock 0.000010, init 0.000011, update 0.000061, query end 0.000053...
    
    -- 10 VALUES
    starting 0.000061, checking permissions 0.000008, Opening tables 0.000027, 
    System lock 0.000008, init 0.000012, update 0.000073, query end 0.000053...
    固定開銷幾乎不變,update 階段微增,單行平均成本大幅下降。

    總結

    1. Batch Insert 是提升 INSERT 吞吐量最簡單高效的手段。
    2. 最佳批次大小需實測校準,通用建議 50~100。
    3. 雙閾值(數量+時間)觸發機制兼顧吞吐與實時性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved