一、數值型別:精打細算每一個位元組
1. 整數家族:依最大值選最小型別
| 型別 | 儲存 | 無號最大值 | 適用場景 |
| TINYINT | 1 Byte | 255 | 年齡、狀態碼、布林旗標 |
| SMALLINT | 2 Bytes | 65,535 | 技能值、小型分類 ID |
| MEDIUMINT | 3 Bytes | 16,777,215 | 千萬級自增 ID、中型統計計數 |
| INT | 4 Bytes | 4,294,967,295 | 通用自增 ID、大多數外鍵 |
| BIGINT | 8 Bytes | 18,446,744,073,709,551,615 | 極大量資料、分散式 ID、時間戳毫秒 |
實戰原則:1000 萬列表用 MEDIUMINT 代替 INT 可省 ~30MB;UNSIGNED 翻倍正數範圍,無負數業務必加。
2. 定點數 DECIMAL/NUMERIC:金額的唯一正解
- 以字串形式逐位儲存,精度固定、運算不失真。
- 每位數字(含小數點)佔 1 Byte,空間較大但值得。
- 定義
DECIMAL(10,2) 表總 10 位、小數 2 位,適合價格、薪資、帳務。
3. 浮點數 FLOAT/DOUBLE:科學計算專用
FLOAT 4 Bytes,精度 ~7 位有效數字,範圍 ±1.17E-38 ~ ±3.4E+38。
DOUBLE 8 Bytes,精度 ~15 位,範圍 ±2.22E-308 ~ ±1.8E+308。
- 嚴禁用於金額:
0.1 + 0.2 != 0.3 經典誤差。僅用於物理模擬、科學統計等容許誤差場景。
二、日期時間型別:選對不浪費
| 型別 | 儲存 | 範圍 | 適用場景 |
| DATE | 3 Bytes | 1000-01-01 ~ 9999-12-31 | 生日、入職日、訂單日期 |
| TIME | 3 Bytes | -838:59:59 ~ 838:59:59 | 每日排班、營業時段 |
| DATETIME | 8 Bytes | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 建立/更新時間、精確到秒的事件 |
| TIMESTAMP | 4 Bytes | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | 自動記錄建立/更新時間、跨時區應用 |
| YEAR | 1 Byte | 1901 ~ 2155 | 年份統計、車款年份 |
選擇指南:只需日期用 DATE;需時區轉換用 TIMESTAMP;一般業務時間用 DATETIME;TIMESTAMP 2038 年問題需評估長期專案風險。
三、字串型別:固定 vs 變長的空間博弈
| 型別 | 長度特性 | 實際儲存 | 適用場景 |
| CHAR(N) | 固定 N 字元 | N Bytes | MD5 雜湊(32)、UUID(36)、國碼(2)、固定代碼 |
| VARCHAR(N) | 變長 ≤ N | 實際長度 + 1~2 Bytes | 姓名、標題、Email、不定長代碼 |
| TINYTEXT | ≤ 255 字元 | 實際長度 + 1 Byte | 短備註、標籤 |
| TEXT | ≤ 65,535 字元 | 實際長度 + 2 Bytes | 文章內容、商品描述 |
| MEDIUMTEXT | ≤ 16,777,215 字元 | 實際長度 + 3 Bytes | 長文檔、日誌 |
| LONGTEXT | ≤ 4,294,967,295 字元 | 實際長度 + 4 Bytes | 極大文本、完整網頁 |
關鍵決策邏輯
- 長度固定且接近上限 →
CHAR(如股票代碼 6 碼,上海多數用 CHAR(6) 比 VARCHAR(6) 省空間)。
- 長度變化大、平均遠小於上限 →
VARCHAR。
- 超過 255 字元 → 直接用
TEXT 家族,勿用巨大 VARCHAR。
VARCHAR 長度 1~255 用 1 Byte 儲存長度,256~65535 用 2 Bytes。
四、ENUM 與 SET:特定場景的效能利器
ENUM(單選)
- 最多 65,535 個元素,儲存 1~2 Bytes(索引值)。
- 適合:性別、狀態(
'pending','paid','shipped','cancelled')、優先級。
- 查詢時自動轉為字串,
ORDER BY 依定義順序排序。
SET(多選)
- 最多 64 個元素,儲存 1~8 Bytes(位元遮罩)。
- 適合:標籤、權限位元組、多重屬性(
'red','green','blue' 可同時存 'red,blue')。
FIND_IN_SET()、& 位元運算查詢極快,可替代多對多關聯表。
五、建表策略黃金法則
- 主鍵盡量用無意義自增整數(
BIGINT UNSIGNED AUTO_INCREMENT),避免業務鍵變更導致叢集索引重組。
- 所有表預設字元集 utf8mb4,支援 Emoji 與完整 Unicode。
- NOT NULL 默認,必要時給
DEFAULT;NULL 會額外佔用位元圖空間並複雜化優化器判斷。
- 索引覆蓋查詢:
EXPLAIN 確認 Using index,避免回表。
- 大欄位拆分:
TEXT/BLOB 獨立副表,主表只存核心欄位,提升掃描效能。
- 外鍵謹慎使用:高併發下鎖競爭嚴重,應用層維護參考完整性常更彈性。