| 原則 | 說明 | 效能影響 |
|---|---|---|
| 優先定長 (CHAR) 而非變長 (VARCHAR) | 頻繁更新表減少碎片、固定位移快速定位 | 空間換時間,適合高頻寫入表 |
| 剛好夠用的長度 | CHAR(40) 而非 CHAR(255) | 減少 I/O、緩衝池佔用、排序暫存空間 |
| 優先數值型別 | MEDIUMINT 而非 BIGINT、DECIMAL(10,2) 而非 DOUBLE | 運算更快、索引更小、緩存更多行 |
| NOT NULL 約束 | 預設 NOT NULL,必要時才允許 NULL | 儲存省 1 bit、查詢無需 IS NULL 判斷、索引更緊湊 |
| 低基數離散值用 ENUM | 狀態、類型、性別等固定集合 | 內部儲存為整數、比較極快、自帶約束 |
SELECT * FROM tbl PROCEDURE ANALYSE(16, 256);
# 建議最佳型別,限制 ENUM 最大值數 16、最大長度 256 字節
依據建議 ALTER TABLE 調整型別。
| 策略 | 適用場景 | 優缺點 |
|---|---|---|
| 單表 BLOB 欄位 | 少量大物件、結構固定 | 簡單,但大量 DELETE/UPDATE 產生碎片 |
| 合成索引 (MD5 雜湊值) | 精確匹配查詢 BLOB 內容 | MD5(blob_col) 存整數索引,查詢極快,不支援範圍查詢 |
| 垂直拆分:BLOB 獨立副表 | 主表高頻查詢、BLOB 低頻讀取 | 主表轉定長行、碎片隔離、JOIN 開銷 |
| 外部儲存 (S3/MinIO/檔案系統) | 超大物件、雲原生 | 資料庫僅存 URI、元資料,徹底解耦 |
SELECT id, name FROM articles WHERE id=123。SELECT content FROM article_blobs WHERE article_id=123。OPTIMIZE TABLE 重建表、回收碎片、更新統計。pt-online-schema-change 線上執行。innodb_file_per_table + OPTIMIZE TABLE 實際執行 ALTER TABLE ... ENGINE=InnoDB 重建。欄位型別是查詢效能的基因。設計原則:定長優於變長、數值優於字串、剛好夠用、NOT NULL 預設、ENUM 低基數、BLOB 垂直拆分。配合 PROCEDURE ANALYSE 週期性審視、OPTIMIZE TABLE 碎片回收,構建高效能儲存基因。