[mysqld]
# 基礎連接
skip-external-locking
skip-name-resolve # 跳過 DNS 解析,加速連接
max_connections = 1024 # 最大連接數
# 查詢緩存 (5.7 已移除,5.5 仍可用於讀多寫少)
query_cache_size = 16M
query_cache_type = 1
# 會話級緩衝 (按連接分配,總量 = 數值 × max_connections,勿設過大)
sort_buffer_size = 1M # ORDER BY/GROUP BY 排序緩衡
read_buffer_size = 1M # 全表掃描順序讀緩衡
read_rnd_buffer_size = 4M # 隨機讀緩衡
join_buffer_size = 1M # JOIN 無索引時緩衡
# 警告:上述 4 項總和 × 1024 連接 = 7GB 遠超 1GB 物理內存!
# 實際建議:sort/read/join 設 256K-512K,read_rnd 1M,依賴系統頁緩存
# 表緩存
table_cache = 256 # 表描述符緩存 (5.5 為 table_open_cache)
# === InnoDB 核心 (最關鍵) ===
innodb_buffer_pool_size = 128M # **核心**:數據+索引緩存,專用機建議 60-70% 內存 (此處 1G 機器留 200M 系統,128M 保守)
innodb_additional_mem_pool_size = 4M # 內部數據結構緩存 (5.6+ 已移除,自動管理)
innodb_log_file_size = 128M # Redo Log 文件大小,建議 Buffer Pool 25%-50%,總大小 < 2G
innodb_log_files_in_group = 2 # Log 文件組數
innodb_log_buffer_size = 2M # 事務日志緩衝,1-8M 適中
innodb_flush_log_at_trx_commit = 1 # **ACID 核心**:1=最安全(每提交刷盤),2=每秒刷盤(可能丟 1 秒), 0=每秒刷盤(崩潰丟 1 秒)
innodb_file_per_table = 1 # 獨立表空間 (必開)
innodb_flush_method = O_DIRECT # 繞過系統頁緩存,減少雙重緩存 (Linux 推薦)
innodb_thread_concurrency = 8 # 並發線程控制 (0=無限,建議 2×CPU核心+磁盤數)
| 參數 | 角色 | 調優原則 | 1G 內存建議值 |
|---|---|---|---|
| innodb_buffer_pool_size | 數據/索引/插入緩衝/自適應哈希/鎖信息 總緩存 | **單一最重要參數**。專用機 60-80% 物理內存。過大導致 Swap 災難性性能下降。數據小則 數據量+10%。 | 128M (保守) ~ 512M (激進,需監控 Swap) |
| innodb_log_file_size | Redo Log 循環寫入,崩潰恢復依賴 | 大 → 減少 Checkpoint 刷盤頻率、提升寫入。但崩潰恢復時間變長。總大小 (× innodb_log_files_in_group) 建議 < 2G。通常設 Buffer Pool 25-50%。 | 64M ~ 128M (總 128-256M) |
| innodb_flush_log_at_trx_commit | 事務提交時 Redo Log 刷盤策略 | **1 = 完全 ACID (默認,生產主庫必設)**。2 = 高性能,丟 1 秒事務。0 = 最高性能,崩潰丟 1 秒。從庫可設 2/0。 | 1 (主庫) |
| innodb_buffer_pool_instances | Buffer Pool 分片數 (5.5+) | >1GB 時建議開啟 (如 8),減少全局鎖競爭。1GB 以下單實例足夠。 | 1 (默認) |
| innodb_read_io_threads / write_io_threads | 後台 IO 線程數 (5.5+) | SSD 可適當增大 (4-16),HDD 默認 4 足夠。 | 4 (默認) |
| innodb_file_per_table | 獨立表空間 (.ibd) | **必開 (1)**。支持表級備份、回收空間、避免系統表空間無限增長。 | 1 |
mysqladmin -u root -p variables | grep innodb_buffer_pool_size
# 或
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
系統保留: ~200MB
InnoDB Buffer Pool: 128M (可調大至 384M 若無其他進程)
InnoDB Log Files: 256M (128M x 2, 文件系統佔用)
InnoDB Log Buffer: 2M
Query Cache: 16M
會話緩衝 (估算峰值 50 連接):
sort/read/join/read_rnd ≈ (0.5+0.5+0.5+1)M x 50 = 125M
表緩存/字典/其他: ~50M
--------------------------------------------------
總計: ~800MB (留 200M 系統/緩存/備用)
關鍵: 監控 Swap 使用率,若 > 0% 則必須縮減 Buffer Pool 或會話緩衝。
1G 內存優化核心:**`innodb_buffer_pool_size` 盡大不 Swap**、**`innodb_flush_log_at_trx_commit=1` 保數據**、**`innodb_log_file_size` 平衡寫入與恢復**、**會話級緩衝極小化**、**開啟 `innodb_file_per_table`**。配置無銀彈,需持續監控 `Innodb_buffer_pool_reads` (磁盤讀取)、`Innodb_log_waits` (日志等待)、`Swap usage` 動態調整。