緩存索引、資料、插入緩衝。專用 DB 建議佔實體記憶體 70%-80%。
# 範例:32GB 記憶體伺服器
innodb_buffer_pool_size = 24G
# 小型資料集(如 500MB)
innodb_buffer_pool_size = 1G # 資料大小 + 20% 餘裕
不可動態調整,需重啟生效。監控指標:
SHOW ENGINE INNODB STATUS\G
-- 觀察 BUFFER POOL AND MEMORY 區塊
Total memory allocated ...
Buffer pool hit rate 1000 / 1000
將緩衝池分割為多個實例,減少鎖爭用。建議值 = 1GB 一個實例,上限 64。
innodb_buffer_pool_instances = 8
內部資料結構記憶體,現由 buffer pool 統一管理,無需設定。
單一 Redo Log 檔案大小。總大小(log_file_size × log_files_in_group)建議接近 buffer pool 的 25%-50%,上限 512GB(單檔 4GB)。
innodb_log_file_size = 1G
innodb_log_files_in_group = 2
較大值減少 checkpoint 頻率,提升寫入效能;但崩潰恢復時間較長。
事務日誌記憶體緩衝,預設 16MB(5.7.6+),通常 16-64MB 即足。大量 BLOB/TEXT 寫入可適當加大。
innodb_log_buffer_size = 32M
| 值 | 行為 | 效能 | 資料安全 |
|---|---|---|---|
| 1 (預設) | 每次 Commit 寫入並 fsync 到磁碟 | 最低 | 最高(零資料遺失) |
| 2 | Commit 寫入 OS 快取,每秒 fsync 一次 | 高 | OS 崩潰/斷電可能遺失 1 秒 |
| 0 | 每秒寫入並 fsync 一次,Commit 不動作 | 最高 | MySQL 崩潰遺失 1 秒 |
主庫建議保持 1;從庫、非核心業務可設 2 兼顧效能。
每表獨立 .ibd 檔案,支援 DROP TABLE、TRUNCATE 回收空間,利於備份遷移。
最大開啟 .ibd 檔案數,預設 300。表數量大時調大,搭配 table_open_cache。
innodb_open_files = 4000
table_open_cache = 4000
背景刷頁、合併插入緩衝等 I/O 操作上限。SSD 建議 2000-5000,NVMe 可設 10000+。
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
Linux 環境繞過 OS 快取直接寫入磁碟,避免雙重快取浪費記憶體。
髒頁比例上限,達到時積極刷盤。可動態調整:
SET GLOBAL innodb_max_dirty_pages_pct = 50; -- 壓力大時降低
背景讀寫執行緒數,預設 4。高併發 SSD 環境可調 8-16。
[mysqld]
# 記憶體
innodb_buffer_pool_size = 24G
innodb_buffer_pool_instances = 16
innodb_log_buffer_size = 64M
# 日誌
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 1
# 檔案
innodb_file_per_table = ON
innodb_open_files = 4000
table_open_cache = 4000
innodb_flush_method = O_DIRECT
# I/O
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
# 其他
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 50
SHOW ENGINE INNODB STATUS、SHOW GLOBAL STATUS 關鍵指標,切勿一次改多參數。