MySQL 效能瓶頸多集中在 IO 與記憶體管理。本文基於 MySQL 5.6.19 實測環境,系統梳理 InnoDB 架構下的檔案結構、線程模型、存取流程,並給出 16 個核心參數的調優建議與原理解析,適用於 SSD、PCIe 等現代儲存介質環境。
| 檔案/目錄 | 用途 | 備註 |
|---|---|---|
ibdata1 | 系統表空間(資料字典、Undo Log、Insert Buffer、Doublewrite 等) | 共享表空間模式核心 |
ib_logfile0/1 | Redo Log(事務日誌) | 循環寫入,崩潰恢復關鍵 |
*.ibd | 獨立表空間(啟用 innodb_file_per_table 後) | 每表獨立,支援空間回收 |
binarylog | Binlog(主從複制、時間點恢復) | 邏輯日誌,非 InnoDB 專屬 |
slow_query.log | 慢查詢日誌 | 調優入口 |
srv_master_thread:主調度,負責刷髒頁、合併 Insert Buffer、清理 Undopage_cleaner_thread:5.6+ 新增,專責刷髒頁,減輕 Master 負擔srv_purge_thread:清除已提交事務的 Undo Logsrv_lock_timeout_thread:鎖超時檢測srv_monitor_thread / srv_error_monitor_thread:監控與錯誤處理
innodb_flush_log_at_trx_commit 刷 Redo Log 到磁碟| 值 | 行為 | 效能 | 資料安全 |
|---|---|---|---|
| 0 | Log Buffer → OS Cache 每秒 flush 磁碟 | 最好 | MySQL 崩潰丟失 1 秒資料 |
| 1 | 每次 Commit:Log Buffer → OS Cache → 磁碟 | 最差 | 完全不丟失(預設) |
| 2 | Commit 寫 OS Cache,每秒 flush 磁碟 | 優 | 僅 OS 崩潰才丟失,推薦生產環境 |
注意:「每秒 flush」受進程調度影響,非絕對 1 秒。
| 模式 | 資料寫入 | 日誌寫入 | 優缺點 |
|---|---|---|---|
| fdatasync(預設) | Buffer Pool → OS Cache → fsync 磁碟 | OS Cache → fsync | 雙緩衝,順序寫效率高 |
| O_DSYNC | Buffer Pool → OS Cache → fsync | 直接寫磁碟 | 日誌無雙緩衝 |
| O_DIRECT | Buffer Pool 直接寫磁碟(繞過 OS Cache) | OS Cache → fsync | 避免雙緩衝,隨機寫優勢大;順序寫稍遜 |

大量隨機寫場景(OLTP)強烈推薦 O_DIRECT;順序寫多(OLAP)可保留 fdatasync。
information_schema 觸發的索引統計採樣Binlog_cache_disk_use 增加)SHOW STATUS LIKE 'Binlog_cache%'| 優點 | 缺點 |
|---|---|
| 獨立表空間、可跨庫移動、刪除/Truncate 回收空間、碎片不影響其他表 | 單表超大(>100GB)管理不便 |
結論:除極大表外,全開獨立表空間。配合調整
innodb_open_files。
echo '1024 65000' > /proc/sys/net/ipv4/ip_local_port_range
echo '1048576' > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo '10' > /proc/sys/net/ipv4/tcp_fin_timeout
innodb_io_capacity、flush_methodinnodb_flush_log_at_trx_commit=2、sync_binlog=100old_blocks_time=1000stats_on_metadata,按業務調整 change_bufferingInnodb_buffer_pool_pages_dirty、Innodb_log_waits、Binlog_cache_disk_use核心原則:參數調優需建立在「觀測 → 假設 → 調整 → 驗證」閉環上。沒有通用最佳配置,只有適合當前業務與硬體的配置。建議以 Percona Monitoring and Management (PMM) 或 Prometheus + Grafana 建立全鏈路觀測體系。