最大記憶體佔用 = 全域緩衝區 + (連線級緩衝區 × 最大連線數)
MySQL Used Mem =
key_buffer_size + query_cache_size + tmp_table_size
+ innodb_buffer_pool_size + innodb_additional_mem_pool_size
+ innodb_log_buffer_size
+ max_connections × (
read_buffer_size + read_rnd_buffer_size
+ sort_buffer_size + join_buffer_size
+ binlog_cache_size + thread_stack
)
-- 設定單位變數
SET @kilo_bytes = 1024;
SET @mega_bytes = @kilo_bytes * 1024;
SET @giga_bytes = @mega_bytes * 1024;
-- 固定參數 (若未動態修改,可用 @@global.xxx)
SET @innodb_buffer_pool_size = 2 * @giga_bytes;
SET @innodb_additional_mem_pool_size = 16 * @mega_bytes;
SET @innodb_log_buffer_size = 8 * @mega_bytes;
SET @thread_stack = 192 * @kilo_bytes;
-- 計算最大記憶體 (GB)
SELECT
( @@key_buffer_size + @@query_cache_size + @@tmp_table_size
+ @innodb_buffer_pool_size + @innodb_additional_mem_pool_size
+ @innodb_log_buffer_size
+ @@max_connections * (
@@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size
+ @@join_buffer_size + @@binlog_cache_size + @thread_stack
)
) / @giga_bytes AS MAX_MEMORY_GB;
| 類型 | 影響範圍 | 修改方式 | 生效對象 |
|---|---|---|---|
| 全域參數 (GLOBAL) | 整個伺服器 | SET GLOBAL var=val; 或配置檔 | **新連線** 生效,舊連線不變 |
| 會話參數 (SESSION) | 當前連線 | SET SESSION var=val; (預設) | 當前連線即時生效 |
修改 GLOBAL 需 SUPER 權限。配置檔修改需重啟生效。
Threads_connected / Max_used_connections 決定上限SET GLOBAL hot_cache.key_buffer_size=100M; + CACHE INDEX t IN hot_cache; + LOAD INDEX INTO CACHE t; 實現熱表索引預載sort_buffer_size=2~4M, read_buffer_size=1~2M, join_buffer_size=2~4Mmax_connections 估算總佔用open_files_limit=65535 並配合 OS ulimit -nThreads_created / Connections 命中率 > 95%SELECT SQL_CACHE ... / SELECT SQL_NO_CACHE ...query_cache_limit (預設 1M) 控制單個結果集上限,過大結果不緩存| 參數 | 建議值 | 說明 |
|---|---|---|
innodb_buffer_pool_size | 物理記憶體 60~80% (專用 DB) | **InnoDB 效能核心**,緩存數據+索引。含 ~21% 額外開銷 (描述資訊、自適應哈希、崩潰恢復) |
innodb_log_buffer_size | 8~64M | 事務日誌緩存,大事務調大 |
innodb_flush_log_at_trx_commit | 1 (最安全) / 2 / 0 (高效能) | 1=每提交刷盤; 2=每秒刷盤; 0=僅寫 OS Cache |
innodb_thread_concurrency | CPU 核心數 × 2 或 0 (無限制) | 控制 InnoDB 內部並發執行緒 |
innodb_additional_mem_pool_size | 8~20M (5.6+ 已廢棄合併至 buffer pool) | 內部資料結構記憶體 |
wait_timeout = 7200 (2小時,預設 8小時)interactive_timeout = 7200validationQuery 使用skip-name-resolve:跳過 DNS 反解析,加速連線建立 (需配合 IP 授權)skip-locking (舊版) / skip-external-locking:關閉外部檔案鎖log-slow-queries + long_query_time=2:開啟慢查詢日誌max_allowed_packet=16M:防止大包斷裂[mysqld]
# 基礎
skip-name-resolve
skip-external-locking
default-storage-engine=InnoDB
character-set-server=utf8mb4
# 連線
max_connections = 1000
max_connect_errors = 10000
wait_timeout = 7200
interactive_timeout = 7200
# 緩衝區 (InnoDB 為主)
innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 1
innodb_thread_concurrency = 0
innodb_file_per_table = 1
# MyISAM 相容 (若有)
key_buffer_size = 128M
# 連線級 (保守)
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 1M
join_buffer_size = 2M
thread_stack = 256K
# 表/執行緒緩存
table_open_cache = 1024
thread_cache_size = 100
open_files_limit = 65535
# 查詢緩存 (視業務啟用)
query_cache_type = 0
query_cache_size = 0
# 臨時表
tmp_table_size = 64M
max_heap_table_size = 64M
# 日誌
log-error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
# 安全
max_allowed_packet = 32M
sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
記憶體配置無銀彈,需根據業務讀寫比、資料量、並發模式、硬體規格綜合權衡,並持續監控 SHOW GLOBAL STATUS 與 OS 層指標 (free, iostat, vmstat) 迭代調優。