資料表設計直接決定查詢性能、存儲成本與維護複雜度。本文提煉三大核心原則,結合實戰案例解析。
場景:表中包含 VARCHAR(5000) 長文本、BLOB、TEXT 等大字段,且高頻查詢不需這些列。
問題:InnoDB 行溢出存儲導致聚簇索引頁存不下完整行,查詢需額外讀取溢出頁,嚴重拖慢掃描速度。
方案:將大字段拆至獨立表,主表僅保留主鍵與高頻列。
-- 主表(高頻查詢) CREATE TABLE user_core ( id BIGINT PRIMARY KEY, username VARCHAR(20), email VARCHAR(50), status TINYINT, created_at DATETIME ) ENGINE=InnoDB; -- 擴展表(低頻訪問) CREATE TABLE user_profile ( user_id BIGINT PRIMARY KEY, bio TEXT, avatar BLOB, preferences JSON, FOREIGN KEY (user_id) REFERENCES user_core(id) ) ENGINE=InnoDB;
場景:訂單、日誌、交易流水等時間序列數據,近期熱訪問,歷史幾乎不查。
方案:按時間範圍分表(分區表或手動分表),熱數據置於高性能存儲,冷數據歸檔至廉價存儲。
-- 範例:按月分表 CREATE TABLE orders_202401 LIKE orders; CREATE TABLE orders_202402 LIKE orders; -- 應用層路由或使用 Partitioning
| 維度 | 範式化(3NF) | 反範式化 |
|---|---|---|
| 優點 | 無冗餘、更新簡單、一致性強 | 查詢少 JOIN、讀性能高 |
| 缺點 | 多表 JOIN 開銷大 | 數據冗餘、更新複雜、一致性風險 |
| 適用場景 | 寫多讀少、強一致性業務(如帳戶、庫存) | 讀多寫少、可容忍最終一致性(如報表、商品詳情) |
好表設計 = 長短分離減少行溢出 + 冷熱分離降低存儲成本 + 讀寫分離模型平衡一致性與性能。隨業務演進動態調整,而非一步到位。