在 Web 架構中,資料持久層是核心瓶頸。MySQL 預設配置僅適合玩具級負載,生產環境必須經過系統性優化。優化涵蓋:資料庫設計、查詢優化、服務器參數、存儲引擎四大維度。
Schema 優化取決於查詢模式與預期資料量。核心考量:正規化、資料類型、索引。
| 正規化特點 | 反正規化特點 |
|---|---|
| 各實體獨立表,無冗余 | 單表存大量資料,冗余高 |
| E-R 圖驅動設計 | 更新開銷大,可能丟失資料 |
| 更新輕量,Join 較耗時 | Select/Order 易優化 |
| 適合 OLTP | 適合 DSS/OLAP |
實務常混合使用:OLTP 表正規化、報表表適度冗余;用物化視圖(MyISAM 模擬)、冗余關鍵字段(如同時存 ref_id 與 name)、簡單對象直接用值作鍵(如 IP)、引用主鍵/唯一鍵讓優化器自動轉換。
MEDIUMINT 比 INT 省 25% 空間NOT NULL 就 NOT NULL,每列省 1 bitROW_FORMAT=FIXED 加速 MyISAMlatin1,utf8 佔 3 倍空間KEY(a,b) 無法服務 WHERE b=5UNIQUE INDEXKEY(name(8))、短鍵值優於長、整數優於字串AUTO_INCREMENT)優於隨機(UUID)OPTIMIZE TABLE 整理碎片,ANALYZE TABLE 更新統計EXPLAIN SELECT ... 驗證索引命中WHERE id='5' 而非 WHERE id=5(字串列)--log-slow-queries --long-query-time=2,再用 EXPLAIN 分析優先用 MySQL 官方二進制版;自編譯風險較大。Intel CPU 可用 Intel C++ 編譯版,查詢速度約提升 30%。
| 參數 | 建議/說明 |
|---|---|
character-set | 單語言用 latin1,少用 utf8 |
memlock | 鎖定記憶體防 swap,記憶體不足時慎用 |
max_allowed_packet | 足夠大避免封包錯誤 |
max_connections | 過大導致 OOM |
table_cache | 通常 512,打開表開銷大 |
query_cache_size | 查詢緩存記憶體大小 |
datadir | 與安裝目錄分盤提升 I/O |
詳細引擎優化見後續專題(InnoDB 緩衝池、Redo Log、鎖調優等)。