資料表設計直接影響系統效能、擴展性與維護成本。本文從命名規範、字符集、儲存引擎、欄位類型、預設值、多庫架構、索引策略七大維度,總結 MySQL 表設計的核心原則與避坑指南。
my_customer),符合開源社區慣例,避免大小寫混淆。myCustomer)易遺漏大寫;中文名(我的客戶)涉及編碼轉換風險。| 字符集 | 適用場景 | 備註 |
|---|---|---|
| utf8mb4 | 中英混合、Emoji、多國語言 | 首選,支援 4 字節字符,MySQL 5.5.3+ 完整支援 |
| utf8 | 中英混合(無 Emoji) | 實為 utf8mb3,不支援補充字符 |
| gbk/gb2312 | 純中文存儲 | 節省空間,但兼容性差 |
| latin1 | 純英文/西歐語言 | 單字節,空間最小 |
建議:庫、表、連接、結果集全鏈路統一 utf8mb4,連接字串加 characterEncoding=utf8mb4。
| 引擎 | 核心特性 | 適用場景 |
|---|---|---|
| InnoDB | 支援事務、行鎖、外鍵、崩潰恢復、MVCC | 預設首選,高併發、數據一致性要求高的核心業務 |
| MyISAM | 表鎖、全文索引、壓縮表、無事務 | 唯讀/少寫、全文搜尋、日誌/統計表 |
| MEMORY | 數據在記憶體、Hash 索引、不支援 BLOB/TEXT | 臨時表、快取表、極高速讀寫、可丟失數據 |
| CSV | CSV 文件存儲、無索引 | 與 Excel/外部系統交換少量數據 |
| BLACKHOLE | 寫入即丟棄、可用於複製過濾 | 主庫只寫不存、異構同步中繼 |
| FEDERATED | 遠程表映射、分布式查詢 | 跨實例查詢、遷移過渡期 |
| NDB Cluster | 分布式、強一致、低延遲 | 金融核心、零容忍延遲場景 |
原則:無特殊理由統一用 InnoDB;MySQL 8.0 已移除部分舊引擎。
TINYINT(1B)、SMALLINT(2B)、MEDIUMINT(3B)、INT(4B)、BIGINT(8B)。UNSIGNED 不改變儲存大小,僅擴大正數範圍。CHAR(N) 適合 ≤10 字符 且長度固定(如 MD5、UUID、手機號),MEMORY 引擎會將 VARCHAR 轉為 CHAR。VARCHAR(N) 佔用實際長度+1~2 字節,通用首選。DECIMAL(M,D) / NUMERIC 用於金額、價格;FLOAT/DOUBLE 僅用於科學計算、非精確場景。TEXT/BLOB 族群(含 TINY/MEDIUM/LONG),BLOB 為二進制,不做字符集校驗。ENUM('a','b') 佔 1~2 字節,適合狀態碼、性別等固定值集合,效能優於 VARCHAR。DATE (3B) 日期TIME (3B) 時間YEAR (1B) 年份,存年份極省空間DATETIME (8B) 無時區,範圍 1000~9999 年TIMESTAMP (4B) 有時區轉換,範圍 1970~2038 年BOOLEAN 即 TINYINT(1),佔 1 字節。ORDER BY RAND() 導致鎖爭用,改用應用層生成隨機序列或雪花算法 ID。INT(5) ZEROFILL 存 12 顯示 00012,替代前導零字符串存儲。NOT NULL 且無顯式 DEFAULT 時,系統自動賦予類型零值('', 0, 0.0, '0000-00-00' 等)。DEFAULT,否則 INSERT 不指定該欄位會報錯。COUNT(col) 不計 NULL、NOT IN 子查詢陷阱多。EXPLAIN 確認索引生效,無效索引純增寫入開銷(插入/更新需維護 B+ 樹)。ENUM、TINYINT 或拆分為兩張表(如 active_users/inactive_users)。SELECT a,b FROM t WHERE c=1 建 INDEX(c,a,b) 避免回表。snake_caseutf8mb4NOT NULL