首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 數據類型選型指南:從存儲原理到實戰節省空間的藝術

     編輯:MySQL 資料庫相關知識

核心原則:夠用就好,越小越快

數據類型決定磁盤占用、內存佔用、CPU 計算代價、索引大小、緩存命中率。選型口訣:整數優於浮點,定長優於變長(高填充率時),最小類型優於大類型,業務語義優於技術便利。

一、數值類型深度解析

1. 整數家族:精確、高效、首選

類型存儲有符號範圍無符號範圍典型場景
TINYINT1B-128 ~ 1270 ~ 255狀態碼、性別、布爾、極小計數器
SMALLINT2B-32,768 ~ 32,7670 ~ 65,535年齡、郵編、小型字典 ID、技能等級
MEDIUMINT3B-8.3M ~ 8.3M0 ~ 16.7M中等規模表主鍵(<1600萬行)、用戶 ID
INT4B-21E ~ 21E0 ~ 42E通用主鍵、外鍵、大計數器
BIGINT8B-922E15 ~ 922E150 ~ 1844E15分布式 ID (Snowflake)、超大表主鍵、時間戳毫秒

實戰節省:1600 萬行表主鍵用 MEDIUMINT UNSIGNED 代替 INT,節省 16MB 純數據 + 索放大節省,緩存能多裝數萬行。

2. 定點數:貨幣、金額的唯一正解

  • DECIMAL(M,D) / NUMERIC(M,D):字符串存儲,每位 1 字節 + 小數點/符號。精度絕不丟失,適合價格、金額、匯率、比率。
  • 定義建議:DECIMAL(19,4) 覆蓋多數貨幣場景(萬億級、4 位小數);DECIMAL(65,30) 科學計算高精度。
  • ⚠️ 計算較慢(轉換為二進制運算),高頻聚合場景可考慮「分/厘」整數存儲(BIGINT 存分),應用層除 100 顯示。

3. 浮點數:科學計算專用,業務禁用

鐵律:任何涉及金額、庫存、計費的業務絕對禁止使用 FLOAT/DOUBLE。0.1 + 0.2 ≠ 0.3 會導致賬目不平。

二、日期時間類型:精度與範圍的權衡

類型存儲精度範圍適用性
FLOAT4B~7 位有效數字±1.17E-38 ~ 3.4E38科學測量、坐標、圖形學
DOUBLE8B~15 位有效數字±2.22E-308 ~ 1.7E308高精度科學計算
類型存儲範圍精度時區感知推薦場景
DATE3B1000-01-01 ~ 9999-12-31天無生日、入職日期、截止日
TIME3B (+小數秒)-838:59:59 ~ 838:59:59秒/微秒無每日排班、營業時間
DATETIME8B (5.6.4 前)1000 ~ 9999秒無通用業務時間(兼容性最好)
TIMESTAMP4B1970 ~ 2038秒有 (會話時區轉換)創建/更新時間戳、跨時區應用
DATETIME(6)5B+ (5.6.4+)1000 ~ 9999微秒無高精度審計、金融流水

選型策略:

  • 需時區自動轉換 → TIMESTAMP(注意 2038 年問題)。
  • 長期存儲、無時區需求 → DATETIME 或 DATETIME(6)。
  • 僅日期/時間 → DATE/TIME 節省空間。

三、字符串類型:定長 vs 變長的數學賬

類型存儲適用場景避坑點
CHAR(N)N 字節 (固定)長度固定、高填充率:MD5/UUID、郵編、手機號、國標代碼實際長度遠小於 N 時極度浪費;CHAR(255) 索引長度超限
VARCHAR(N)實際長度 + 1/2 字節長度前綴長度變動、平均長度遠小於 N:姓名、地址、描述、JSON 片段更新導致長度增長可能引發頁分裂;VARCHAR(65535) 受行大小 65535 限制
TEXT/BLOB溢出頁 + 20 字節指針超長文本/二進制:文章內容、圖片、日誌不在內存排序、不支持全文索引 (MyISAM)、SELECT * 會讀取溢出頁

股票代碼實戰:CHAR 還是 VARCHAR?

  • 上海 6 位、深圳 4 位(歷史),平均長度 5.2,最大 6。
  • CHAR(6):固定 6 字節,無前綴,索引緊湊,適合高頻 JOIN/排序。
  • VARCHAR(6):平均 6.2 字節(含 1 字節前綴),略大。
  • 結論:高頻關聯鍵、長度接近固定 → CHAR 勝出。

四、特殊類型與新特性

  • BIT(1):單位位,MySQL 內部聚合為 TINYINT,適合布爾標誌位組合。
  • JSON (5.7+):二進制存儲,支持路徑查詢、索引 (虛擬列)、部分更新,替代 TEXT 存儲半結構化數據。
  • ENUM/SET:內部映射整數,不推薦(DDL 修改值需重建表、移植性差、優化器統計不準),用 TINYINT + 應用層字典/Check 约束替代。
  • SPATIAL (GIS):POINT/POLYGON 等,空間索引 (R-Tree) 支持範圍/相鄰查詢。

五、建表決策清單

  1. 業務是否需要小數精確?→ DECIMAL / 整數分單位。
  2. 數值範圍上限?→ 選最小整數類型 + UNSIGNED。
  3. 時間是否跨時區?→ TIMESTAMP / DATETIME + 應用層時區。
  4. 字符串長度分佈?→ 抽樣統計平均/最大長度,決定 CHAR/VARCHAR/TEXT。
  5. 是否高頻 JOIN/排序/分組?→ 窄列、定長、整數優先,建立覆蓋索引。
  6. 預估 3 年增長量?→ 主鍵類型預留 10 倍空間(MEDIUMINT → INT → BIGINT)。

數據類型選型是 schema 設計的基因,決定了系統未來 3-5 年的存儲成本、查詢性能、擴展彈性。每次建表前花 10 分鐘算賬,能省下未來無數個夜晚的優化痛苦。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved