基於《高效能 MySQL》核心章節整理,聚焦邏輯/物理設計基石:選對類型、拒絕 NULL、善用緩存表與匯總表。
| 類型 | 位元數 | 有號範圍 | 無號上限 |
|---|---|---|---|
| TINYINT | 8 | -128~127 | 255 |
| SMALLINT | 16 | -32,768~32,767 | 65,535 |
| MEDIUMINT | 24 | -8,388,608~8,388,607 | 16,777,215 |
| INT | 32 | -2,147,483,648~2,147,483,647 | 4,294,967,295 |
| BIGINT | 64 | -9.22e18~9.22e18 | 1.84e19 |
INT(1) 與 INT(20) 儲存計算完全相同,顯示寬度不影響範圍。
DECIMAL:精確小數,金額必用;但佔用空間大、運算慢。FLOAT (4B) / DOUBLE (8B):近似值,科學計算適用。| 類型 | 特性 | 適用場景 |
|---|---|---|
| VARCHAR(N) | 變長,1-2B 長度前綴;UPDATE 易產生碎片 | 最大長度遠大於平均、低頻更新、UTF-8 多字節字符集 |
| CHAR(N) | 定長,空間補齊;不易碎片 | 極短固定長(MD5、UUID、Y/N 旗標)、高頻更新欄位 |
| BLOB/TEXT | 大對象,無法全長索引 | 極大文本/二進制;InnoDB 超長 VARCHAR 會轉為 BLOB 存儲 |
| ENUM | 預定義集合,極省空間(1-2B) | 狀態碼、類型碼;尾部新增值無需重建表 |
| SET | 多值集合,位運算 | 多屬性標籤(如文章標籤) |
字符數 ≠ 位元組數:CHAR(1) UTF-8 佔 1-3 位元組;VARCHAR(1) 需 2 位元組(長度前綴+數據)。
| 類型 | 空間 | 範圍 | 時區 | 建議 |
|---|---|---|---|---|
| DATETIME | 8B | 1000-9999 年 | 無關 | 跨時區應用、需固定時間點 |
| TIMESTAMP | 4B | 1970-2038 年 | 依賴時區 | 一般業務、自動更新欄位 |
| DATE | 3B | 日期 | 無關 | 僅需精確到日 |
BIT(N):最多 64 位,實際較少用。SET:多布林值合併存儲的替代方案。- 或用 UNHEX() 轉 BINARY(16),讀取用 HEX() 還原。INET_ATON() 存、INET_NTOA() 取,佔 4 位元組 vs VARCHAR(15) 15 位元組。