MyISAM vs InnoDB 深度對比:緩存、事務、鎖機制、物理存儲四大核心差異
選擇儲存引擎是架構設計的關鍵決策。本文從緩存策略、事務支援、鎖粒度、物理存儲四大維度,配合原理圖解,徹底釐清兩大引擎的適用邊界。
一、緩存機制:索引緩存 vs 統一緩存池
| 維度 | MyISAM | InnoDB |
| 緩存對象 | 僅索引(.MYI) | 索引 + 資料頁(Buffer Pool) |
| 資料檔緩存 | 依賴 OS 檔案系統緩存 | 自管,不依賴 OS |
| 優化焦點 | key_buffer_size | innodb_buffer_pool_size(建議佔物理記憶體 70-80%) |
MyISAM 讀取資料檔(.MYD)每次需穿透 OS 層,read_buffer_size/read_rnd_buffer_size 直接影響全表掃描與索引掃描效能。
二、事務支援:無 vs 完整 ACID
- MyISAM:不支援事務,操作即時生效,崩潰易損壞資料;
- InnoDB:完整支援 ACID,支援 Commit/Rollback、Savepoint、主外鍵約束。
三、鎖機制:表鎖 vs 行鎖/頁鎖
| 維度 | MyISAM | InnoDB |
| 鎖層級 | 表級鎖(Server 層實現) | 行級鎖/頁級鎖(引擎層實現) |
| 並發寫入 | 極低,讀寫互斥 | 高,行級並發極佳 |
| 死鎖 | 不發生 | 可能發生,需應用層處理 |
四、物理存儲架構:分離 vs 聚集
1. 檔案結構
| 引擎 | 檔案 | 說明 |
| MyISAM | .frm | 表結構定義 |
| .MYI | 索引檔 |
| .MYD | 資料檔 |
| InnoDB | .frm | 表定義 |
| .ibd | 獨立表空間(innodb_file_per_table=ON) |
| .ibdata | 共享表空間(innodb_file_per_table=OFF) |
2. 資料頁組織
- MyISAM:無頁概念,資料順序存放於 .MYD,三種格式(靜態/動態/壓縮);
- InnoDB:所有資料以 16KB 頁為單位,按主鍵聚集組織(Clustered Index),葉節點即完整資料行。
3. 索引架構對比(B+ 樹)
MyISAM(非聚集索引):
- 主索引與輔助索引結構相同,葉節點存 資料行地址(指針);
- 索引頁 1024 Bytes,存於 .MYI;
- 需「索引查找 → 取地址 → 回表讀資料」兩次 I/O。
InnoDB(聚集索引 + 輔助索引回主鍵):
- 主索引即資料本身,葉節點存完整行,Key 為主鍵;
- 輔助索引葉節點存 主鍵值,查詢需「輔助索引 → 取主鍵 → 回主索引」兩次 B+ 樹查找;
- 索引頁 16KB,與資料頁共存於表空間。
4. 主鍵強制要求
InnoDB 必須有主鍵:無顯式 PK 時,自動選唯一非空索引;仍無則生成 6 字節隱藏 RowID。MyISAM 可無主鍵。
五、選型決策樹
- 需要事務/外鍵/行級並發 → InnoDB(預設首選);
- 純讀取/全文搜尋(5.6 前)/極簡日誌/嵌入式 → MyISAM;
- 記憶體表/極速暫存 → MEMORY;
- 大數據分析/列式壓縮 → ColumnStore/ClickHouse 另謀出路。
- 上一篇文章: MySQL 常見資料類型完整圖解:整數、浮點、字串、日期時間選型指南
- 下一篇文章: 《MySQL必知必會》讀書筆記(二):通配符、正則、字串函數、日期數學與聚合函數
Copyright ©
程式碼之家 All Rights Reserved