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

MySQL 數據類型詳解:選擇正確類型提升資料庫效能

     編輯:MySQL 綜合教學

MySQL 數據類型詳解:選擇正確類型提升資料庫效能

註:以下內容針對 MySQL 5.0 及以上版本

MySQL 支援的數據類型非常豐富,選擇正確的數據類型對於獲得高性能至關重要。本文結合網上技術博客與《高性能 MySQL》一書內容整理而成,旨在幫助開發者做出最優選擇。

選擇數據類型的三大核心原則

  1. 更小的通常更好:應盡量使用能正確存儲數據的最小數據類型,減少磁盤 I/O 與記憶體佔用。
  2. 簡單就好:簡單數據類型的操作通常需要更少的 CPU 週期,如整數比字符串運算快得多。
  3. 盡量避免 NULL:可為 NULL 的列會增加索引、索引統計和值比較的複雜度,導致優化器難以生成最優執行計劃。

MySQL 數據類型三大類別

MySQL 主要支援三大類數據類型:數字類型、字符串類型 和 日期時間類型。

一、數字類型

數字類型整體可分為整數型和浮點型兩大類。

1. 整數類型

類型儲存空間有符號範圍
TINYINT1 字節-128 ~ 127
SMALLINT2 字節-32,768 ~ 32,767
MEDIUMINT3 字節-8,388,608 ~ 8,388,607
INT4 字節-2,147,483,648 ~ 2,147,483,647
BIGINT8 字節±9.22×10¹⁸

關鍵點:

  • 加上 UNSIGNED 後,最大值翻倍(如 TINYINT UNSIGNED 為 0~255)。
  • INT(M) 中的 M 只是顯示寬度,不影響實際儲存範圍。INT(1) 與 INT(20) 在儲存與計算上完全相同。

2. 浮點類型

類型精度儲存空間說明
FLOAT(M,D)單精度(約 7 位有效數字)4 字節M 為總位數,D 為小數位數
DOUBLE(M,D)雙精度(約 15 位有效數字)8 字節M 為總位數,D 為小數位數

範例: 定義 FLOAT(5,3),插入 123.45678 實際儲存為 123.457(四捨五入),但總位數按實際計算。

3. 定點數(精確數值)

DECIMAL(M,D):M < 65 為總位數,D < 30 且 D < M 為小數位數。

  • MySQL 5.0+ 將數字打包儲存於二進制字符串中(每 4 字節存 9 位數字)。
  • 浮點類型儲存同樣範圍值時通常比 DECIMAL 佔用更少空間。
  • 建議: 僅在對小數需精確計算時使用 DECIMAL(如財務數據);大數據量場景可考慮用 BIGINT 替代(存儲分為單位的整數)。

二、字符串類型

類型長度特性最大長度
CHAR(N)固定長度255 字符
VARCHAR(N)變長65,535 字符
TINYTEXT變長255 字符
TEXT變長65,535 字符
MEDIUMTEXT變長16,777,215 字符
LONGTEXT變長4,294,967,295 字符

CHAR vs VARCHAR

  1. CHAR(N):不足 N 字符以空格補齊,查詢時去除尾部空格;尾部不能有空格。固定佔用 N 字節。
  2. VARCHAR(N):實際佔用「字符數 + 1~2 字節」(長度前綴)。
  3. CHAR 檢索速度通常快於 VARCHAR(固定長度便於定位)。

VARCHAR vs TEXT

  1. VARCHAR 可指定長度,TEXT 不可;VARCHAR 佔用「實際字符數 + 1~2 字節」,TEXT 佔用「實際字符數 + 2 字節」。
  2. TEXT 類型不能有預設值。
  3. VARCHAR 可直接建索引,TEXT 建索引需指定前綴長度;同有索引時 VARCHAR 查詢更快。

三、二進制數據(BLOB 系列)

  • BLOB 以二進制方式儲存,不區分大小寫;TEXT 以文本方式儲存,區分大小寫。
  • BLOB 數據只能整體讀出。
  • TEXT 可指定字符集,BLOB 無需指定。

四、日期時間類型

類型格式範例說明
DATE'2008-12-02'日期
TIME'12:25:36'時間
DATETIME'2008-12-02 22:06:44'日期時間
TIMESTAMP自動記錄修改時間隨記錄修改自動刷新,適合記錄最後修改時間

數據類型屬性速查

關鍵字含義
NULL / NOT NULL允許/禁止 NULL 值
DEFAULT預設值
PRIMARY KEY主鍵
AUTO_INCREMENT自動遞增(適用整數類型)
UNSIGNED無符號
CHARACTER SET name指定字符集

各類型儲存長度對照表(節選)

名稱長度(字節)用法/範圍說明
TINYINT1無符號 0~255,有符號 -128~127
SMALLINT2無符號 0~65535,有符號 -32768~32767
MEDIUMINT3無符號 0~16777215,有符號 -8388608~8388607
INT4無符號 0~4294967295,有符號 -2147483648~2147483647
BIGINT8無符號 0~18446744073709551615
FLOAT4單精度浮點數
DOUBLE8雙精度浮點數
DECIMAL(M,D)M+1 或 M+2未打包浮點數(精確計算)
DATE3YYYY-MM-DD
DATETIME8YYYY-MM-DD HH:MM:SS
TIMESTAMP4YYYY-MM-DD HH:MM:SS
TIME3HH:MM:SS
YEAR1YYYY
CHAR(M)M定長字符串
VARCHAR(M)L+1 或 L+2變長字符串 (L 為實際長度)
TINYBLOB/TEXTL+1最大 255 字節
BLOB/TEXTL+2最大 64KB
MEDIUMBLOB/TEXTL+3最大 16MB
LONGBLOB/TEXTL+4最大 4GB
ENUM1 或 2最多 65535 個不同值
SET1~8最多 64 個不同值

總結: 依據業務場景選擇最小、最簡單、避免 NULL 的類型,是資料庫高效能設計的基石。

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