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

MySQL 記憶體架構深度解析(上):線程專用記憶體完整圖譜與調優指南

     編輯:MySQL 資料庫相關知識

MySQL 記憶體分類總覽

MySQL 記憶體使用分為兩大類:

  • 線程專用記憶體:每個客戶端連線獨佔,隨連線數線性增長
  • 全域共享記憶體:Instance 級共享,如 Query Cache、Buffer Pool 等

本文聚焦線程專用記憶體,逐項拆解用途、控制參數與調優要點。

八大線程專用記憶體區

記憶體區控制參數核心用途調優關鍵
線程棧thread_stack (預設 256KB)線程 ID、執行上下文、遞歸深度複雜儲存程序/遞歸需增大,否則棧溢出 Crash
排序緩衝sort_buffer_size (預設 256KB)ORDER BY / GROUP BY filesort不足時落盤臨時檔,效能斷崖式下跌。OLAP 查詢建議 2-8MB
Join 緩衝join_buffer_size (預設 256KB)無索引 Join (ALL/INDEX) 的 Block Nested Loop太小導致被驅動表重複掃描,IO 放大。建議 1-4MB,配合加索引
順序讀緩衝read_buffer_size (預設 128KB)全表掃描、全索引掃描的順序預讀大表掃描場景可適度增大至 1-2MB
隨機讀緩衝read_rnd_buffer_size (預設 256KB)索引回表、排序後 Join 等非順序讀取配合 read_buffer_size 調整,通常 2-4x
網路緩衝net_buffer_size (預設 16KB)連線資訊 + 結果集發送前暫存動態擴展至 max_allowed_packet,通常無需調整
批量插入緩衝bulk_insert_buffer_size (預設 8MB)INSERT ... VALUES(..),(..) / LOAD DATA INFILE大批量導入建議 32-128MB,僅對 MyISAM/Aria 生效
臨時表記憶體tmp_table_size / max_heap_table_size內部臨時表(GROUP BY、DISTINCT、UNION 等)超過閾值轉 MyISAM 落盤。建議 64-256MB,兩參數取較小值

總量風險試算

最大記憶體 ≈ 全域共享 + (單線程專用總和 × max_connections)

例:單線程專用 10MB × 1000 連線 = 10GB + 全域 8GB = 18GB
若物理記憶體 16GB → 必發生 OOM 或嚴重 Swap

調優鐵律

  1. 先算總帳:max_connections × 單線程上限 < 物理記憶體 70%
  2. 按場景調:OLTP 小查詢多 → 減小 sort/join buffer;OLAP 大查詢少 → 增大 sort/join buffer
  3. 監控命中率:
    • Sort_merge_passes 增長快 → 增加 sort_buffer_size
    • Created_tmp_disk_tables / Created_tmp_tables > 10% → 增加 tmp_table_size
  4. 拒絕盲目加大:參數越大 ≠ 效能越好,超過工作集大小純屬浪費

下篇預告

全域共享記憶體深度解析:Query Cache、Thread Cache、Table Cache、Key Buffer、InnoDB Buffer Pool、Redo Log Buffer、Adaptive Hash Index 等核心組件。

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