MySQL 以快速、易用著稱,但高性能應用需要洞察力。本文提煉五大核心原則,幫助開發者設計高效的數據庫架構與查詢。
反模式:「廚房下水道」式設計——什麼都存,導致表膨脹、索引失效、緩存命中率下降。
實戰案例:產品表含價格、稅率、運費。稅費可由應用層或生成列實時計算,無需持久化。若稅率變更,持久化列需批量 UPDATE,計算列零成本適應。
靈活變更:MySQL ALTER TABLE 支持動態加列(ADD COLUMN rank INT),無需預留冗餘列。
性能代價:
Using index 消失)rs.getString(3) 易斷)最佳實踐:
-- 明確列名
SELECT name, rank, description FROM products;
-- 應用層按列名訪問:rs.getString("name") 而非 rs.getString(1)
直觀理解:將電子表格「扁平化」拆分為關聯表。以 CD 收藏為例:
| 反範式(單表) | 範式化(三表) |
|---|---|
album | track1 | track2 | track3 ------|--------|--------|------- Best | Song A | Song B | Song C |
albums: id, title tracks: id, album_id, track_no, title artists: id, name album_artists: album_id, artist_id |
收益:消除更新/刪除異常、節省存儲、支持多對多關係、便於擴展屬性。
ANALYZE TABLE 更新統計信息,保證優化器決策準確EXPLAIN SELECT * FROM orders WHERE user_id=123 AND status='paid' ORDER BY created_at DESC;
關鍵指標:
type:system > const > eq_ref > ref > range > index > ALL(目標至少 ref)key:實際使用的索引rows:預估掃描行數(越小越好)Extra:Using index(覆蓋索引)、Using where、Using filesort(需優化)INT、VARCHAR、DATETIME)SELECT *、ORDER BY RAND()、大事務OPTIMIZE TABLE、監控 QPS/延遲/連接數