MySQL 效能優化是系統工程,涵蓋硬體、作業系統、編譯參數、儲存架構、SQL 與索引設計。本文依官方文件脈絡,整理關鍵優化向度與實測數據,助您構建高吞吐、低延遲的資料庫服務。
| 瓶頸類型 | 特徵 | 優化方向 |
|---|---|---|
| 磁碟尋道 | 隨機讀寫延遲,現代磁碟平均 <10ms,理論 1000 IOPS | 資料分散多磁碟、RAID、SSD |
| 磁碟傳輸 | 循序讀寫 10-20 MB/s | 多磁碟並行讀取、分區 |
| CPU 運算 | 資料載入記憶體後的處理 | 優化查詢、適當索引、避免全表掃描 |
| 記憶體頻寬 | CPU 快取不足時的資料搬移 | 增加快取、優化資料結構 |
pgcc 或 Cygnus CodeFusion 最佳;gcc -O6 次之。pgcc -O6 編譯 sql_yacc.cc 需 ~200MB 記憶體。-static 可提升 ~13% 效能(僅服務端關鍵)。--skip-locking(單實例時安全),避免 flock() 相容性問題。pgcc -O6 vs gcc:+11%# 將資料庫/資料表移至其他磁碟
ln -s /mnt/disk2/db1 /var/lib/mysql/db1
ln -s /mnt/disk3/db1/tbl.MYD /var/lib/mysql/db1/tbl.MYD
ln -s /mnt/disk4/db1/tbl.MYI /var/lib/mysql/db1/tbl.MYI
MySQL 解析符號連結(需支援 realpath()),讀寫導向實體磁碟,降低單磁碟爭用。
將資料按塊輪詢分布於多磁碟(RAID 0 概念)。效能高度依賴分區大小、存取模式(隨機/循序),需實測調校。
mount -o noatime /dev/sdX /mnt/data
關閉 atime 更新,減少無謂磁碟尋道。
db2 -> db1 會導致同表雙寫入不一致)。mysys/mf_format.c 移除 lstat 檢查,直接 realpath 解析。.MYD, .MYI)使用符號連結。key_buffer_size(索引快取)、table_cache、sort_buffer_size、read_rnd_buffer_size、innodb_buffer_pool_size(InnoDB 專用)。SHOW STATUS 觀察命中率調整。WHERE、JOIN、ORDER BY 高頻欄位;複合索引遵循最左前綴。SELECT *、LIKE '%...'、欄位運算、OR、NOT IN 等非 SARGable 寫法。EXPLAIN 分析 type、key、rows、Extra。WHERE id > (SELECT MAX...))避免深翻頁效能崩塌。ANALYZE TABLE 更新統計資訊,OPTIMIZE TABLE 整理碎片。使用 sql-bench 或自製腳本,模擬真實負載(讀寫比例、並發數、資料量),對比優化前後的:
單一變因測試,避免誤判。
MySQL 優化無終點,唯有「測量 → 分析 → 調整 → 驗證」的持續迴圈。從編譯器選擇、磁碟佈局、記憶體配置,到 SQL 寫法與索引設計,每一環都可能成為瓶頸。建立完整監控體系(Prometheus + Grafana)、定期演練基準測試、累積優化知識庫,才能在業務增長中保持資料庫效能領先優勢。