資料庫效能受限於四大硬體資源:磁碟 I/O(尋道/吞吐)、CPU 運算、記憶體容量、網路頻寬。優化目標是將熱資料留在記憶體、減少磁碟存取、降低 CPU 無效運算。本文建立從硬體 → 參數 → SQL → 架構的四層優化模型。
| 資源 | 瓶頸特徵 | 優化手段 |
|---|---|---|
| 磁碟尋道 | 隨機 I/O 7200 RPM 理論 7200 IOPS | RAID 10、SSD/NVMe、多磁碟分離數據/日誌/備份 |
| 磁碟吞吐 | 循序讀寫快 | 並行讀寫、大塊 I/O、檔案系統調優 (deadline/noop 調度器) |
| CPU | 小表熱點運算 | 多核並行、查詢並行化、避免複雜函數在 WHERE 中 |
| 記憶體 | 緩衝區不足導致磁碟交換 | 大內存、關閉 Swap 或用 tmpfs、NUMA 親和性綁定 |
核心原則:一次只改一個參數、漸進式增大、測試環境驗證、參考官方範本 (my-small/medium/large/huge.cnf)。
| 參數 | 建議起始值 | 作用 | 調優信號 |
|---|---|---|---|
| innodb_buffer_pool_size | 物理記憶體 60-80% | InnoDB 數據+索引緩衝 | Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests > 1% |
| innodb_log_file_size | 512M - 2G | Redo Log 大小 | 頻繁 checkpoint、log 切換等待 |
| innodb_log_buffer_size | 16M - 64M | 事務日誌緩衝 | 大事務提交慢 |
| innodb_flush_log_at_trx_commit | 1 (安全) / 2 (效能) | 提交時 fsync 策略 | 2 輕微風險換高寫入吞吐 |
| max_connections | 500-2000 | 最大連線數 | Threads_connected 接近上限 |
| table_open_cache | 4000+ | 表緩存 | Opened_tables 快速增長 |
| query_cache_type/size | OFF / 0 | 查詢緩存 | MySQL 5.7+ 建議關閉,改用 Redis |
| sort_buffer_size | 2M-8M | 排序緩衝 | Sort_merge_passes 高 |
| join_buffer_size | 2M-8M | JOIN 緩衝 | Select_full_join 高 |
| tmp_table_size / max_heap_table_size | 64M-256M | 臨時表記憶體上限 | Created_tmp_disk_tables 高 |
| thread_cache_size | 100+ | 線程緩存 | Threads_created 快速增長 |
-- 消除冗餘括號、常數折疊、常數傳遞
(a AND b) AND c OR (a AND b) AND (a AND d)
→ (a AND b AND c) OR (a AND b AND d)
-- 常數條件下推
WHERE a > 5 AND b = 5 → WHERE b = 5 AND a > 5 (b=5 先過濾)
LIMIT 1 等價於索引定位,極快。LIMIT m,n 深分頁用「延遲關聯」或「ID 緩存」(參考文章 90981)。LIMIT + ORDER BY 若排序欄位有索引,可避免 filesort。-- INSERT 批次化
INSERT INTO t VALUES (...), (...), ...; -- 單條 SQL 多行
-- 大量載入
LOAD DATA INFILE 'file.csv' INTO TABLE t; -- 比 INSERT 快 20 倍
-- UPDATE/DELETE 分批、加鎖優化
LOCK TABLES t WRITE; -- 批次操作前鎖表,索引緩衝區只刷一次盤
| 引擎 | 特點 | 適用場景 |
|---|---|---|
| InnoDB | 事務、行鎖、外鍵、崩潰恢複、MVCC | 預設首選,OLTP 核心業務 |
| MyISAM | 表鎖、全文索引、壓縮表、讀多寫少 | 唯讀報表、日誌、靜態查詢表 |
| MEMORY (HEAP) | 純記憶體、HASH 索引、重啟丟失 | 臨時查詢緩存、查找表、Session 存儲 |
| Archive | 僅支援 INSERT/SELECT、高壓縮 | 審計日誌、歷史歸檔 |
| NDB Cluster | 分散式、記憶體、同步複寫、99.999% | 電信級計費、即時競價 |
pt-query-digest、mysqldumpslow、slow_query_log 導入資料庫(參考 90973)。pt-index-usage、pt-duplicate-key-checker、EXPLAIN FORMAT=JSON。pt-online-schema-change、gh-ost。xtrabackup (物理熱備)、mydumper/loader (並行邏輯備份)。mysqld_exporter,核心指標 50+。MySQL 優化無銀彈,唯有系統性觀測、科學診斷、精準治療、持續驗證的閉環。將本文四層模型內化為團隊標準作業程序,讓每個開發者都能寫出高效 SQL,每個 DBA 都能精準調優,效能問題將不再是救火,而是可預測、可控制的工程指標。