MySQL 作為最流行的開源資料庫,提供多種存儲引擎。其中 InnoDB 與 MyISAM 是最常用、差異最大的兩種。本文從事務支援、鎖機制、效能特徵、適用場景等維度深度對比,協助選型決策。
| 引擎 | 類型 | 特點 |
|---|---|---|
| InnoDB | 事務安全 | 支援事務、行級鎖、外鍵、崩潰恢復 |
| MyISAM | 非事務安全 | 讀取快、全文索引、表級鎖、不支援事務/外鍵 |
| MEMORY (HEAP) | 非事務安全 | 資料駐留記憶體,極速讀寫,重啟資料遺失 |
| MERGE | 非事務安全 | 多個 MyISAM 表邏輯合併 |
| BDB (BerkeleyDB) | 事務安全 | 支援事務、頁級鎖,已逐漸被 InnoDB 取代 |
MyISAM 採用表級鎖,讀鎖與寫鎖互斥,且寫鎖優先級高於讀鎖。即使讀請求先到達,後到的寫請求會插隊到讀請求之前。這導致:
low-priority-updates:降低更新優先級SET LOW_PRIORITY_UPDATES=1INSERT/UPDATE/DELETE LOW_PRIORITYmax_write_lock_count:達到閾值時暫時降低寫優先級InnoDB 預設 autocommit=ON,若未顯式開啟事務(BEGIN),每條 INSERT/UPDATE 皆自動提交,嚴重影響批量寫入效能。
# 查看狀態
SELECT @@autocommit;
# 會話級關閉
SET autocommit=0;
# 啟動參數永久關閉(MySQL 5.1+)
# 在 my.cnf [mysqld] 區段添加:
init_connect='SET AUTOCOMMIT=0'
| 特性 | MyISAM | InnoDB |
|---|---|---|
| 事務支援 | 不支援 | 完整支援 |
| 鎖粒度 | 表級鎖 | 行級鎖 |
| 外鍵 | 不支援 | 支援 |
| 全文索引 | 支援 (5.6+ InnoDB 也支援) | 5.6+ 支援 |
| GIS 資料 | 支援 | 不支援 (早期版本) |
| COUNT(*) 效能 | 極快(儲存行數) | 需掃描全表 |
| 表空間大小 | 較小 | 較大(約 2 倍) |
| 崩潰恢復 | 需人工修復 | 自動恢復 |