首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 資料類型完整指南:選型策略、儲存空間與效能考量

     編輯:MySQL 綜合教學

MySQL 資料類型選型:空間、效能與精度的平衡藝術

合理的資料類型選擇能節省 30-50% 儲存空間、提升索引效能、減少 I/O。本文系統整理數值、日期時間、字串、枚舉/集合四大類型的選型原則與實戰建議。

一、數值類型

整數類型 (精確、索引友善)

類型位元組無號範圍有號範圍典型用途
TINYINT10 ~ 255-128 ~ 127布林旗標、狀態碼、年齡、小型枚舉
SMALLINT20 ~ 65,535-32,768 ~ 32,767郵遞區號、中型計數、技能點數
MEDIUMINT30 ~ 16,777,215-8,388,608 ~ 8,388,607中等流水號、AUTO_INCREMENT (千萬級)
INT / INTEGER40 ~ 4,294,967,295-2,147,483,648 ~ 2,147,483,647通用 ID、流水號、預設首選
BIGINT80 ~ 1.84e19-9.22e18 ~ 9.22e18分散式 ID、超大流水、時間戳毫秒

選型原則

  1. 夠用就好: 每欄位省 1 位元組,千萬列省 10 MB,億級省 100 MB
  2. 無號優先: ID、計數、關聯鍵皆非負,UNSIGNED 翻倍正向範圍
  3. AUTO_INCREMENT 配合: 預估最大行數選最小型別

定點數:DECIMAL / NUMERIC (精確貨幣)

  • 以字串形式儲存,每位數 1 位元組 + 小數點 1 位元組
  • DECIMAL(10,2) 佔 12 位元組,範圍 -99999999.99 ~ 99999999.99
  • 價格、金額、費率、比例 必須用 DECIMAL,禁止 FLOAT/DOUBLE

浮點數:FLOAT / DOUBLE (科學計算)

民用系統極少需求,謹慎使用。

二、日期時間類型

類型位元組精度範圍適用
FLOAT4~7 位有效數字±1.17e-38 ~ ±3.4e38座標、感測器讀數、圖形計算
DOUBLE8~15 位有效數字±2.22e-308 ~ ±1.8e308高精度科學計算
類型位元組範圍精度適用場景
YEAR11901 ~ 2155年出生年、年度統計
DATE31000-01-01 ~ 9999-12-31日生日、訂單日期、日誌日期
TIME3-838:59:59 ~ 838:59:59秒工時、時長、每日排程
DATETIME8 (5.6.4 前) / 5+fsp1000 ~ 9999微秒 (fsp)通用時間戳、不受時區影響
TIMESTAMP4 (5.6.4 前) / 4+fsp1970 ~ 2038微秒 (fsp)自動更新欄位、跨時區系統

關鍵差異

  • TIMESTAMP:儲存 UTC,讀取轉換為連線時區,ON UPDATE CURRENT_TIMESTAMP 自動更新
  • DATETIME:字面值儲存,不做時區轉換,範圍更大
  • 5.6.4+ 兩者支援小數秒 DATETIME(3)、TIMESTAMP(3)

三、字串類型

定長 vs 變長

類型儲存方式空間計算適用
CHAR(n)固定 n 位元組,右補空格n 位元組MD5/UUID (CHAR(32)/CHAR(36))、ISO 代碼、固定長度代碼
VARCHAR(n)實際長度 + 1/2 位元組長度前綴L + 1 (≤255) / L + 2 (>255)姓名、標題、描述、非固定長度文字

選型決策

  • 長度固定且接近上限 → CHAR (避免 1 位元組前綴開銷)
  • 長度變化大、平均遠小於上限 → VARCHAR
  • VARCHAR(255) 臨界點:超過 255 字元長度前綴變 2 位元組

大物件類型 (BLOB/TEXT 族)

類型最大長度長度前綴適用
TINYBLOB/TEXT255 B1 B短備註、標籤
BLOB/TEXT64 KB2 B文章內容、JSON 文檔
MEDIUMBLOB/TEXT16 MB3 B長文、小型二進位
LONGBLOB/TEXT4 GB4 B大型文檔、影像、影音

最佳實務: 大物件拆分至獨立表 (垂直分表),主表僅存檔案路徑/雲端 URL,避免主表膨脹影響掃描效能。

四、枚舉與集合

類型儲存成員上限選擇數適用
ENUM('a','b','c')1-2 位元組 (索引值)65,535單選性別、狀態、分類、優先級
SET('a','b','c')1-8 位元組 (位元遮罩)64多選標籤、權限位元組、多屬性

ENUM 實戰優勢

-- 性別欄位
`gender` ENUM('male','female','other') NOT NULL DEFAULT 'other'

-- 插入
INSERT INTO users (gender) VALUES ('male');  -- 字串寫入,內部存 1

-- 查詢
SELECT * FROM users WHERE gender = 'female'; -- 索引查詢極快

-- 排序按定義順序,非字母順
ORDER BY gender;  -- male(1), female(2), other(3)

五、選型檢查清單 (Code Review 用)

  1. ID 欄位是否 UNSIGNED?
  2. 金額欄位是否 DECIMAL(p,2)?
  3. 定長代碼是否用 CHAR?
  4. 狀態/分類是否用 ENUM?
  5. 大文本是否垂直分表?
  6. 時區敏感欄位是否用 TIMESTAMP?
  7. 索引欄位長度是否最小化 (前綴索引)?

資料類型是 Schema 設計的地基。每次建表前花 5 分鐘思考類型選擇,上線後能省下數倍的調優成本。

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