隨機讀寫主導資料庫負載。選擇低尋道時間、高 IOPS的磁碟(企業級 SAS/NVMe SSD),避免消費級 SATA SSD 在持續寫入下效能崩塌。
noatime、nodiratime,關閉存取時間更新,減少元資料寫入。delayed allocation),適配大檔案循環寫入特性。| 策略 | 做法 | 適用場景 |
|---|---|---|
| 符號連結分離 | 將特定資料庫/表的 .ibd、.frm 連結至獨立磁碟 | 熱點表隔離、備份磁碟分離 |
| RAID 0 條帶 | 多磁碟並行,提升吞吐,無冗餘 | 可重建資料(臨時表、中間結果、唯讀副本) |
| RAID 10 (1+0) | 鏡像+條帶,兼顧效能與可用性 | 核心業務資料、Redo Log、Undo Tablespace |
| RAID 5/6 | 奇偶校驗,寫入罰分嚴重 | 不建議用於高寫入資料庫負載 |
最佳實踐:Redo Log、Undo Log、Binary Log、資料檔案分別置於獨立物理裝置或 RAID 10 卷,消除 I/O 爭用。
vm.swappiness=1 或 0(Linux 3.5+),避免 InnoDB 頁面被換出導致延遲尖峰。innodb_numa_interleave=ON 或 numactl --interleave=all 啟動,避免跨節點記憶體存取。| 參數 | 說明 | 調優方向 |
|---|---|---|
innodb_buffer_pool_size | InnoDB 核心緩衝池(資料+索引+鎖+自適應雜湊) | 物理記憶體 60~80%;監控 Innodb_buffer_pool_wait_free 為 0。 |
innodb_buffer_pool_instances | 緩衝池分區數,減少全域互斥鎖爭用 | 每分區 ≥ 1GB;建議 8~16(視 Buffer Pool 總大小)。 |
innodb_log_file_size | Redo Log 單檔大小 | 1~4 GB;較大減少 Checkpoint 頻率與刷盤壓力,啟動恢復稍慢。 |
innodb_log_files_in_group | Redo Log 群組檔案數 | 通常 2~4 個。 |
innodb_flush_log_at_trx_commit | 事務提交刷盤策略 | 1=安全;2=高效(OS Crash 丟 1 秒);0=極速(MySQL Crash 丟 1 秒)。 |
sync_binlog | Binlog 同步頻率 | 1=安全;N>1 批次同步;0=交給 OS(風險最高)。 |
innodb_io_capacity / innodb_io_capacity_max | 後台刷頁 I/O 能力上限 | 設定為裝置實測 IOPS 的 80~90%(如 NVMe 10 萬 IOPS 設 80000)。 |
innodb_read_io_threads / innodb_write_io_threads | 背景 I/O 執行緒數 | 預設 4;高 IOPS 裝置可調 8~16。 |
max_connections | 最大連線數 | 配合連線池(ProxySQL、HikariCP)設定,避免連線風暴;監控 Threads_connected。 |
table_open_cache | 表快取數 | max_connections × 平均每連線開表數 × 1.5~2。 |
delayed_queue_size | INSERT DELAYED 隊列長度 | 若大量使用 DELAYED INSERT,適度調大;現代版本建議改用非同步寫入架構。 |
服務器層調優是「硬體給上限,參數定下限,監控找缺口」。以磁碟 I/O 隔離為基石,記憶體配置為核心,參數微調為杠桿,建立可觀測、可復現的調優閉環,方能持續榨乾硬體效能。