本文系統梳理 MySQL 核心知識點,涵蓋數據類型選型、存儲引擎差異、核心名詞解析、實體關係建模與關係型/面向對象映射,幫助開發者建立完整的數據庫技術體系。
| 類型 | 存儲 | 有符號範圍 | 適用場景 |
|---|---|---|---|
| 1 byte | -128 ~ 127 | 狀態碼、布爾標誌 | |
| 2 bytes | -32,768 ~ 32,767 | 小範圍計數 | |
| 4 bytes | -2.1B ~ 2.1B | 通用主鍵、外鍵 | |
| 8 bytes | -9.2E18 ~ 9.2E18 | 海量數據主鍵、時間戳 |
避坑指南:INT(20) 與 INT(11) 存儲範圍完全相同,括號內數字僅影響 ZEROFILL 顯示寬度,不影響存儲。
DECIMAL(10,2):定點數,精確存儲金額。超出精度會四捨五入(非截斷),金融系統必須使用,嚴禁 FLOAT/DOUBLE。
| 類型 | 特點 | 索引行為 |
|---|---|---|
CHAR(N) | 定長,空格填充,讀取時去除尾部空格 | 全長索引,適合固定長度代碼(如 MD5、身份證) |
VARCHAR(N) | 變長,1-2 字節存長度,無填充 | 前綴索引常用,節省空間 |
TEXT | 大文本,最大 64KB,不支持默認值,索引需指定前綴長度 | 全文索引或前綴索引 |
| 類型 | 範圍 | 時區行為 | 適用場景 |
|---|---|---|---|
DATETIME | 1000-01-01 ~ 9999-12-31 | 不轉換,存什麼顯示什麼 | 業務時間、創建時間 |
TIMESTAMP | 1970-01-01 ~ 2038-01-19 | 存儲時轉 UTC,讀取轉會話時區 | 自動更新時間戳、跨時區應用 |
ENUM('Y','N') 內部以整數存儲(1,2...),比 CHAR(1) 節省空間且內建約束,但修改枚舉值需 ALTER TABLE(鎖表),高頻變更場景慎用。
| 特性 | InnoDB | MyISAM | Memory |
|---|---|---|---|
| 事務支持 | ✅ ACID | ❌ | ❌ |
| 鎖粒度 | 行鎖 | 表鎖 | 表鎖 |
| 外鍵 | ✅ | ❌ | ❌ |
| 崩潰恢復 | ✅ Redo/Undo Log | ❌ 易損壞 | ❌ 重啟丟失 |
| 全文索引 | 5.6+ 支持 | ✅ 早期優勢 | ❌ |
| 適用場景 | OLTP、高併發、數據安全 | 只讀、全文搜索、非關鍵日誌 | 臨時表、緩存、查找表 |
結論:MySQL 5.5+ 默認 InnoDB,通用場景首選 InnoDB,無特殊理由不建議使用 MyISAM。
| 維度 | 自底向上(傳統 ER) | 自頂向下(DDD/領域建模) |
|---|---|---|
| 起點 | 數據庫表結構 | 領域對象/業務語言 |
| 流程 | ER 圖 → 代碼 → 界面 | 界面/用例 → 領域模型 → 數據庫 |
| 核心關注 | 數據存儲、範式 | 業務行為、不變量、聚合根 |
| 映射關係 | 表 ≈ 類,列 ≈ 屬性 | 聚合根 ≈ 表,值對象可能內嵌或單獨表 |
// 領域模型
class Order {
OrderId id;
Money totalAmount;
List items; // 值對象集合
OrderStatus status;
}
// 對應表結構(簡化)
orders: id, total_amount, status, version
order_items: id, order_id, product_id, quantity, unit_price
主流解決方案:
許多開發者急於學「優化」,卻不懂 TINYINT vs INT、CHAR vs VARCHAR、索引原理、鎖機制。基礎不牢,地動山搖。 建議學習路徑:
EXPLAIN 分析與慢查詢優化夯實基礎,優化自然水到渠成。