資料型別直接影響儲存空間、記憶體使用、磁碟 I/O 與索引效能。選擇「剛好夠用」的最小型別,是效能調優的第一步。
| 型別 | 儲存大小 | 有號範圍 | 無號範圍 | 適用場景 |
|---|---|---|---|---|
| TINYINT | 1 Byte | -128 ~ 127 | 0 ~ 255 | 布林值、狀態碼、小範圍計數 |
| SMALLINT | 2 Bytes | -32,768 ~ 32,767 | 0 ~ 65,535 | 中小範圍計數、年齡、排序權重 |
| MEDIUMINT | 3 Bytes | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 中等範圍 ID、庫存數量 |
| INT | 4 Bytes | -2.1B ~ 2.1B | 0 ~ 4.2B | 通用主鍵、大範圍計數 |
| BIGINT | 8 Bytes | -9E18 ~ 9E18 | 0 ~ 1.8E19 | 極大數值、分散式 ID、時間戳毫秒 |
實戰建議:若最大值不超過 1600 萬,MEDIUMINT 比 INT 節省 25% 空間;狀態欄位用 TINYINT 而非 INT。
| 特性 | CHAR (定長) | VARCHAR (變長) |
|---|---|---|
| 儲存方式 | 固定長度,不足右側補空格 | 實際長度 + 1-2 Bytes 長度前綴 |
| 更新效能 | 極佳,不產生碎片 | 頻繁更新長度變化易產生碎片 |
| 空間效率 | 長度固定時較高 | 長度變化大時較高 |
| 適用場景 | MD5、UUID、郵遞區號、固定代碼 | 姓名、地址、描述、標題 |
決策原則:頻繁 UPDATE 的表優先用 CHAR;長度差異大、讀多寫少用 VARCHAR。
建議:除非業務真正需要「未知/不存在」語意,否則一律 NOT NULL DEFAULT '' 或 DEFAULT 0。
適用於固定值集合:狀態、性別、分類、優先級等。
status ENUM('pending','processing','completed','cancelled') NOT NULL DEFAULT 'pending'
ORDER BY status 依定義順序排序,非字母順序ALTER TABLE,不如查詢表靈活SELECT * 會無差別拖回巨大欄位,佔用網路與記憶體-- 查詢:WHERE a=1 AND b=2 ORDER BY c -- 最佳索引 INDEX idx_abc (a, b, c)
SELECT a,b,c FROM t WHERE a=1 僅掃描索引,不回表SELECT * 破壞覆蓋索引效果SELECT * FROM table_name PROCEDURE ANALYSE(16, 256);
max_elements=16:建議 ENUM 最大值數max_memory=256:分析時每欄最大記憶體根據建議配合 ALTER TABLE 調整型別,可顯著縮減表體積。