1. 資料類型收斂:PROCEDURE ANALYSE()
SELECT * FROM tbl_name PROCEDURE ANALYSE();
SELECT * FROM tbl_name PROCEDURE ANALYSE(16,256); -- 忽略值>16或長度>256的ENUM建議
- 根據實際資料分布建議最佳類型(如
VARCHAR(200) 實際只存 20 字元 → 建議 VARCHAR(20))。
- 結合業務預留冗餘,避免過度收斂導致未來擴充困難。
2. 縱向拆分
- 將高頻訪問欄位(且盡量定長)與低頻/大欄位(TEXT、BLOB)分離為兩表,1:1 關聯。
- 高頻表行長固定 → 查詢/更新極快;低頻表僅按需 JOIN。
- 適用 MyISAM,InnoDB 亦受益於減少頁分裂與緩衝池浪費。
3. 橫向拆分
- 按業務維度(時間、地區、租戶)將資料分散至多表或分區。
- 降低單表大小,減少 MyISAM 表鎖爭用;InnoDB 減少 B-tree 深度。
- MySQL 5.1+ 原生支援 Partitioning。
4. 逆範式化
- 為高頻查詢引入冗餘欄位,避免多表 JOIN。
- 代價:寫入成本略增、一致性維護複雜化。
- 適用:查詢極多、更新較少、容忍最終一致性的場景(如報表、緩存表)。
5. 冗餘統計表 / 臨時表
CREATE TEMPORARY TABLE:Session 級、記憶體存儲、斷開自動清理。
- 大表統計分析:先
INSERT ... SELECT 導入臨時表,再對臨時表聚合,避免鎖定大表、佔用緩衝池。
6. 選擇合適引擎
| 場景 | 建議引擎 | 理由 |
| 嚴重鎖衝突 | InnoDB | 行鎖減少衝突 |
| 查詢多、事務要求低 | MyISAM | 全表鎖但查詢快、壓縮表支援 |