MySQL 記憶體使用分為兩大類:
本文聚焦線程專用記憶體,逐項拆解用途、控制參數與調優要點。
| 記憶體區 | 控制參數 | 核心用途 | 調優關鍵 |
|---|---|---|---|
| 線程棧 | 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
max_connections × 單線程上限 < 物理記憶體 70%Sort_merge_passes 增長快 → 增加 sort_buffer_sizeCreated_tmp_disk_tables / Created_tmp_tables > 10% → 增加 tmp_table_size全域共享記憶體深度解析:Query Cache、Thread Cache、Table Cache、Key Buffer、InnoDB Buffer Pool、Redo Log Buffer、Adaptive Hash Index 等核心組件。