資料庫效能優化是系統工程師的必修課。本文系統整理從 SQL 撰寫、資料表設計、客戶端應用到伺服器參數調校的四大維度優化策略,並附上實用指令與案例分析,助您解決生產環境效能瓶頸。
透過 SHOW STATUS 觀察關鍵計數器:
Com_select、Com_insert、Com_update、Com_delete:各操作執行次數Innodb_rows_read/inserted/updated/deleted:InnoDB 層面行級統計Com_commit、Com_rollback:交易提交/回滾次數,回滾頻繁可能暗示應用邏輯問題Slow_queries:慢查詢計數--log-slow-queries 記錄超過 long_query_time 的查詢SHOW PROCESSLIST 查看當前執行緒狀態、鎖表情況關鍵欄位說明:
type:連接類型,system > const > eq_ref > ref > range > index > ALL,越左效能越好possible_keys / key:可用索引 vs 實際使用索引rows:預估掃描行數Extra:Using index(覆蓋索引)、Using where、Using temporary、Using filesort 等關鍵提示實戰案例:LEFT JOIN 導致 driven table 呈現type=ALL全表掃描,對 JOIN 欄位建立索引後變為ref,rows從 9999 降為 1。
| 場景 | 優化策略 |
|---|---|
| 大量插入 (MyISAM) | ALTER TABLE ... DISABLE KEYS → 批次 INSERT → ENABLE KEYS |
| 大量插入 (InnoDB) | 按主鍵排序資料、SET UNIQUE_CHECKS=0、SET AUTOCOMMIT=0 |
| 批次 INSERT | 使用多值語法 INSERT ... VALUES (...), (...), ...,比單條快數倍 |
| GROUP BY | 不需排序時加 ORDER BY NULL 禁止隱含排序 |
| ORDER BY | 善用索引順序,避免混合 ASC/DESC、跨索引排序 |
| 子查詢轉 JOIN | NOT IN (SELECT...) 改為 LEFT JOIN ... WHERE IS NULL 避免建立暫存表 |
| 鎖爭用 | MyISAM 可用 LOW_PRIORITY/HIGH_PRIORITY/DELAYED 調整讀寫優先權 |
PROCEDURE ANALYSE() 獲取建議,避免過度冗餘CREATE TEMPORARY TABLE 適用中小量統計分析適用「讀多寫少、資料不常變」的表。關鍵參數:
query_cache_type:0=關閉、1=開啟(預設)、2=按需query_cache_size:建議 64MB~512MB,過大反而增加鎖爭用Qcache_hits、Qcache_lowmem_prunes、Qcache_free_memoryCPU Cache → Memory → Disk 存取速度遞減。善用作業系統頁面快取、RAID 控制器 BBWC、SSD 等硬體加速。
replicate-do-table 降低頻寬優化原則: 先測量、再分析、後調整、驗證效果。每次只調一個參數,建立基準線對比。