read_buffer_size 控制每個連線進行全表順序掃描時分配的記憶體緩衝區大小。設定過小導致頻繁磁碟 I/O,設定過大造成記憶體浪費。本文從原理、公式、實例配置三維度給出標準化建議。
type=ALL)、範圍掃描無索引、ORDER BY 無索引需 filesort 前的讀取階段max_connections × read_buffer_size 為理論峰值佔用sort_buffer_size = 2M read_buffer_size = 1M read_rnd_buffer_size = 8M join_buffer_size = 2M
關鍵註記:sort_buffer_size > 256KB 觸發 mmap() 分配,效能下降;官方建議 2MB 為平衡點。
| 參數 | 原值 | 優化後 | 理由 |
|---|---|---|---|
| sort_buffer_size | 32M | 8M | 過大觸發 mmap,高併發下記憶體壓力大 |
| read_buffer_size | 32M | 8M | 同理由,順序掃描不需過大緩衝 |
| read_rnd_buffer_size | 16M | 8M | 排序後隨機讀緩衝,8M 足夠 |
| table_open_cache | 512 | 2048 | 減少開表開銷,配合 open-files-limit |
| max_allowed_packet | 5M | 16M | 支援大欄位/批次插入 |
| tmp_table_size | 64M | 2G | 減少臨時表落盤,配合 max_heap_table_size |
| innodb_buffer_pool_size | 3G | 10G (60-80%) | 核心效能參數,熱數據全內存 |
| innodb_additional_mem_pool_size | 20M | 128M | 中繼資料緩衝,5.7+ 已廢用合併至 buffer pool |
| join_buffer_size | 未設定 | 8M | 必須顯式設定,無索引 JOIN 關鍵 |
| 伺服器記憶體 | read_buffer_size | sort_buffer_size | read_rnd_buffer_size | join_buffer_size | max_connections 建議 |
|---|---|---|---|---|---|
| 4 GB | 256 KB | 512 KB | 1 MB | 256 KB | 200 |
| 8 GB | 512 KB | 1 MB | 2 MB | 512 KB | 300 |
| 16 GB | 1 MB | 2 MB | 4 MB | 1 MB | 500 |
| 32 GB | 2 MB | 4 MB | 8 MB | 2 MB | 800 |
| 64 GB+ | 4 MB | 8 MB | 16 MB | 4 MB | 1000+ |