主鍵類型選擇直接影響效能、儲存空間、外鍵關聯一致性。核心原則:類型最小化、全庫統一、避免字串與隨機值。
整數類型:首選
- 運算快、支援
AUTO_INCREMENT
- 範例:美國州代碼用
TINYINT (1 字節) 即可,不用 INT (4 字節)。作為外鍵時節省 75% 空間
- 屬性
UNSIGNED 必須全庫一致
ENUM/SET:不適合主鍵
- 內部存整數,字串比較時隱含轉型,效能損耗
- 適合狀態、類型、性別等靜態分類欄位
- 極少數情況 (如產品類型表以 ENUM 為主鍵) 可用,但通常避免
字串類型:能避則避
- 佔空間大、比較慢於整數
MyISAM 預設壓縮字串索引,導致查找變慢
- 隨機字串 (MD5, SHA1, UUID) 危害極大:
① 插入隨機位置 → 頁分裂、隨機 I/O、聚簇索引碎片
② 相鄰邏輯行分散磁碟/記憶體 → 範圍查詢慢
③ 破壞快取局部性 → 命中率驟降
UUID 最佳實踐
- 移除連字號或
UNHEX() 轉 16 位元組二進位,存 BINARY(16)
- 讀取用
HEX() 還原
- UUID 比純隨機略好 (有時間序列),但仍不如整數
黃金法則總結
- 盡量用整數 (
BIGINT/INT/BIGINT UNSIGNED)
- 全庫關聯表主鍵/外鍵類型完全一致 (含屬性)
- 選最小滿足範圍的類型,預留成長空間
- 拒絕隨機字串主鍵,若必須用 UUID → 二進位存儲