SQL 優化非玄學,而是「基準 → 測試 → 診斷 → 重構」的工程化流程。本文彙整九大核心原則,涵蓋基準建立、Schema 設計、索引策略、引擎特性與 MySQL 專屬技巧,助你系統化提升資料庫效能。
sysbench、supersmack、ab 模擬高併發負載。slow_query_log=ON、long_query_time=1(秒)。mtop、innotop 即時觀察執行緒狀態。EXPLAIN、SHOW STATUS、SHOW PROCESSLIST 定位掃表、臨時表、檔案排序等問題。top、vmstat、iostat 監控資源飽和度。SMALLINT 別用 BIGINT;固定長度字串用 CHAR,變長用 VARCHAR。posts_tags)應用 PRIMARY KEY (post_id, tag_id) 複合主鍵,省去 relation_id 空間與索引維護成本。WHERE、JOIN、ORDER BY、GROUP BY。SELECT a,b FROM t WHERE c=1 → INDEX(c,a,b) 避免回表。SELECT ..., (SELECT MAX(created) FROM posts WHERE author_id=a.id) FROM authors a。SELECT a.id, MAX(p.created) FROM authors a JOIN posts p ON a.id=p.author_id GROUP BY a.id。JOIN、派生表、CTE 將行級邏輯轉為集合運算。| 特性 | MyISAM | InnoDB |
|---|---|---|
| 鎖粒度 | 表鎖 | 行鎖 |
| 事務 | 不支援 | ACID |
| 外鍵 | 不支援 | 支援 |
| COUNT(*) | O(1) 元資料 | O(N) 掃描 |
| 崩潰恢復 | 無 | Redo/Undo Log |
SQL_CALC_FOUND_ROWS + FOUND_ROWS() 替代 COUNT(*)。INSERT ... ON DUPLICATE KEY UPDATE:Upsert 單語句完成。REPLACE INTO:主鍵衝突時刪舊插新。INSERT IGNORE:忽略重複鍵錯誤。INSERT DELAYED:高併發下隊列易爆滿導致資料丟失。USE INDEX、FORCE INDEX、IGNORE INDEX 輔助優化器決策。優化是持續迭代:建基準 → 找慢查 → 看執行計畫 → 改 Schema/索引/SQL → 驗證基準。工欲善其事,必先利其器——熟練掌握 EXPLAIN、慢查詢日誌、效能監控三板斧,才能在 MySQL 世界遊刃有餘。