數據類型決定磁盤占用、內存佔用、CPU 計算代價、索引大小、緩存命中率。選型口訣:整數優於浮點,定長優於變長(高填充率時),最小類型優於大類型,業務語義優於技術便利。
| 類型 | 存儲 | 有符號範圍 | 無符號範圍 | 典型場景 |
|---|---|---|---|---|
TINYINT | 1B | -128 ~ 127 | 0 ~ 255 | 狀態碼、性別、布爾、極小計數器 |
SMALLINT | 2B | -32,768 ~ 32,767 | 0 ~ 65,535 | 年齡、郵編、小型字典 ID、技能等級 |
MEDIUMINT | 3B | -8.3M ~ 8.3M | 0 ~ 16.7M | 中等規模表主鍵(<1600萬行)、用戶 ID |
INT | 4B | -21E ~ 21E | 0 ~ 42E | 通用主鍵、外鍵、大計數器 |
BIGINT | 8B | -922E15 ~ 922E15 | 0 ~ 1844E15 | 分布式 ID (Snowflake)、超大表主鍵、時間戳毫秒 |
實戰節省:1600 萬行表主鍵用 MEDIUMINT UNSIGNED 代替 INT,節省 16MB 純數據 + 索放大節省,緩存能多裝數萬行。
DECIMAL(M,D) / NUMERIC(M,D):字符串存儲,每位 1 字節 + 小數點/符號。精度絕不丟失,適合價格、金額、匯率、比率。DECIMAL(19,4) 覆蓋多數貨幣場景(萬億級、4 位小數);DECIMAL(65,30) 科學計算高精度。BIGINT 存分),應用層除 100 顯示。| 類型 | 存儲 | 精度 | 範圍 | 適用性 | |
|---|---|---|---|---|---|
FLOAT | 4B | ~7 位有效數字 | ±1.17E-38 ~ 3.4E38 | 科學測量、坐標、圖形學 | |
DOUBLE | 8B | ~15 位有效數字 | ±2.22E-308 ~ 1.7E308 | 高精度科學計算 |
| 類型 | 存儲 | 範圍 | 精度 | 時區感知 | 推薦場景 |
|---|---|---|---|---|---|
DATE | 3B | 1000-01-01 ~ 9999-12-31 | 天 | 無 | 生日、入職日期、截止日 |
TIME | 3B (+小數秒) | -838:59:59 ~ 838:59:59 | 秒/微秒 | 無 | 每日排班、營業時間 |
DATETIME | 8B (5.6.4 前) | 1000 ~ 9999 | 秒 | 無 | 通用業務時間(兼容性最好) |
TIMESTAMP | 4B | 1970 ~ 2038 | 秒 | 有 (會話時區轉換) | 創建/更新時間戳、跨時區應用 |
DATETIME(6) | 5B+ (5.6.4+) | 1000 ~ 9999 | 微秒 | 無 | 高精度審計、金融流水 |
選型策略:
TIMESTAMP(注意 2038 年問題)。DATETIME 或 DATETIME(6)。DATE/TIME 節省空間。| 類型 | 存儲 | 適用場景 | 避坑點 |
|---|---|---|---|
CHAR(N) | N 字節 (固定) | 長度固定、高填充率:MD5/UUID、郵編、手機號、國標代碼 | 實際長度遠小於 N 時極度浪費;CHAR(255) 索引長度超限 |
VARCHAR(N) | 實際長度 + 1/2 字節長度前綴 | 長度變動、平均長度遠小於 N:姓名、地址、描述、JSON 片段 | 更新導致長度增長可能引發頁分裂;VARCHAR(65535) 受行大小 65535 限制 |
TEXT/BLOB | 溢出頁 + 20 字節指針 | 超長文本/二進制:文章內容、圖片、日誌 | 不在內存排序、不支持全文索引 (MyISAM)、SELECT * 會讀取溢出頁 |
CHAR(6):固定 6 字節,無前綴,索引緊湊,適合高頻 JOIN/排序。VARCHAR(6):平均 6.2 字節(含 1 字節前綴),略大。BIT(1):單位位,MySQL 內部聚合為 TINYINT,適合布爾標誌位組合。JSON (5.7+):二進制存儲,支持路徑查詢、索引 (虛擬列)、部分更新,替代 TEXT 存儲半結構化數據。ENUM/SET:內部映射整數,不推薦(DDL 修改值需重建表、移植性差、優化器統計不準),用 TINYINT + 應用層字典/Check 约束替代。SPATIAL (GIS):POINT/POLYGON 等,空間索引 (R-Tree) 支持範圍/相鄰查詢。DECIMAL / 整數分單位。UNSIGNED。TIMESTAMP / DATETIME + 應用層時區。MEDIUMINT → INT → BIGINT)。數據類型選型是 schema 設計的基因,決定了系統未來 3-5 年的存儲成本、查詢性能、擴展彈性。每次建表前花 10 分鐘算賬,能省下未來無數個夜晚的優化痛苦。