L7 SQL 與索引優化 ← 最高 ROI,最常見
L6 my.cnf 參數調優
L5 資料庫服務配置(引擎、編譯、大表拆分)
L4 OS 層面(檔案系統、限制、服務精簡)
L3 架構層(讀寫分離、分庫分表、快取層)
L2 單機優化(服務配置、實例隔離)
L1 硬體選型(CPU、記憶體、磁碟、網路) ← 基石
| 元件 | 建議 | 理由 |
|---|---|---|
| 記憶體 | 大容量、高頻寬、避免 Swap | InnoDB Buffer Pool 越大越好,Swap 會造成延遲抖動 |
| 磁碟 | NVMe SSD / RAID 10 (HDD 15k RPM) | 隨機 IOPS 決定寫入與檢查點效能;RAID 5 寫入懲罰大 |
| CPU | 64 位、高主頻、大 L3 Cache、高核心數 | 單執行緒效能決定單查詢延遲;多核心支撐高併發 |
| 網路 | 萬兆/千兆、同機房、繞過防火牆 | 複寫、備份、叢集心跳極度敏感延遲 |
systemctl disable postfix chronyd firewalld ...。/etc/security/limits.conf mysql soft nofile 65535; mysql hard nofile 65535。noatime,nodiratime 減少元資料寫入。echo never > /sys/kernel/mm/transparent_hugepage/enabled,避免記憶體分配延遲抖動。noop/none,HDD 用 deadline。-DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 ... 精簡模組。| 類別 | 關鍵參數 | 調優方向 |
|---|---|---|
| 連線/並發 | max_connections, thread_cache_size, open_files_limit, table_open_cache | 避免 "Too many connections";thread_cache 降低建立執行緒開銷 |
| InnoDB 核心 | innodb_buffer_pool_size (物理記憶體 60-80%), innodb_log_file_size (1-4GB), innodb_flush_log_at_trx_commit (1=最安全, 2=高效能), innodb_file_per_table=ON | Buffer Pool 承載熱數據;Redo Log 大小平衡檢查點頻率與恢復時間 |
| 查詢快取 | query_cache_type=0, query_cache_size=0 | 5.7+ 已移除;高併發下鎖競爭嚴重,建議關閉改用 Redis |
| 排序/連線/暫存表 | sort_buffer_size, join_buffer_size, read_buffer_size, tmp_table_size, max_heap_table_size | 按連線分配,避免設太大導致 OOM;tmp_table_size 超過則落盤 |
| MyISAM 專屬 | key_buffer_size, read_rnd_buffer_size, bulk_insert_buffer_size | 若仍有 MyISAM 表需調整 |
| 複寫/雙寫 | sync_binlog=1, binlog_format=ROW, relay_log_recovery=ON | 資料零遺失、主從一致性 |
EXPLAIN 驗證 type=ref/range/eq_ref、Extra=Using index。(a,b,c) 支援 a/a,b/a,b,c 查詢。SELECT a,b FROM t WHERE c=1 → INDEX (c,a,b) 避免回表。WHERE DATE(created_at)='2024-01-01' → WHERE created_at >= '2024-01-01' AND created_at < '2024-01-02'。LIMIT 100000,10 → 子查詢 WHERE id > (SELECT id FROM t ORDER BY id LIMIT 100000,1) 或游標式 WHERE id > last_id LIMIT 10。ANALYZE TABLE 更新統計資訊,防止優化器誤判。| 工具 | 用途 | 典型指令 |
|---|---|---|
| vmstat | 系統級 CPU/記憶體/IO/Context Switch | vmstat 1 10 |
| iostat | 磁碟 IOPS/Throughput/Util% | iostat -xmt 1 |
| top/htop | 進程級 CPU/MEM/執行緒狀態 | top -Hp <mysqld_pid> |
| free | 記憶體/Swap 使用 | free -h |
| SHOW PROCESSLIST | 當前活躍/阻塞查詢 | SHOW FULL PROCESSLIST; |
| EXPLAIN | 查詢執行計畫 | EXPLAIN FORMAT=JSON SELECT ... |
| PERFORMANCE_SCHEMA | 等待事件、鎖、IO、階段耗時 | SELECT * FROM events_statements_summary_by_digest ORDER BY AVG_TIMER_WAIT DESC LIMIT 10; |
| pt-query-digest | 慢查詢日誌聚合分析 | pt-query-digest /var/log/mysql/slow.log |
調優無終點,唯有持續度量、假設、驗證、固化。建立基準線,設定 SLA,自動化巡檢,讓資料庫永遠在最佳狀態服務業務。