基於《MySQL 權威指南》與《高性能 MySQL》整理的系統筆記,涵蓋邏輯分層、鎖機制、事務 ACID、隔離級別、MVCC、主流存儲引擎對比及引擎轉換實操。

| 粒度 | 特點 | 適用引擎 |
|---|---|---|
| 表鎖 | 開銷最小、並發最低、無死鎖 | MyISAM、MEMORY |
| 頁鎖 | 折中 | BDB |
| 行鎖 | 開銷最大、並發最高、支援死鎖檢測 | InnoDB |
鎖策略是在鎖開銷與數據安全性間尋找平衡。InnoDB 預設行鎖,僅對索引記錄加鎖;無索引條件會退化為表鎖。
| 級別 | 髒讀 | 不可重複讀 | 幻讀 | 備註 |
|---|---|---|---|---|
| READ UNCOMMITTED | 可能 | 可能 | 可能 | 極少用 |
| READ COMMITTED | 不可能 | 可能 | 可能 | Oracle 預設 |
| REPEATABLE READ | 不可能 | 不可能 | 可能(InnoDB 用 MVCC 解決) | MySQL 預設 |
| SERIALIZABLE | 不可能 | 不可能 | 不可能 | 串行化、並發極低 |
innodb_lock_wait_timeout 超時回滾。修改先寫 Redo Log(循環寫入)、再刷盤,崩潰恢復時重放 Redo Log 保證持久性。
InnoDB 每行隱藏兩列:trx_id(建立版本)、roll_pointer(刪除版本/Undo Log 指針)。
trx_id <= 當前事務版本 且 刪除版本未定義 或 > 當前版本 的行。trx_id = 當前版本。刪除版本 = 當前版本。trx_id = 當前版本,舊行標記刪除版本。優點:讀不加鎖、寫僅鎖必要行;缺點:額外存儲、版本鏈遍歷開銷。
僅在 REPEATABLE READ、READ COMMITTED 生效。
| 特性 | InnoDB | MyISAM |
|---|---|---|
| 事務 | 支援(ACID) | 不支援 |
| 鎖粒度 | 行鎖 | 表鎖 |
| 外鍵 | 支援 | 不支援 |
| 崩潰恢復 | Redo/Undo Log | 需人工 REPAIR |
| 聚簇索引 | 主鍵聚簇 | 非聚簇(堆表) |
| 全文索引 | 5.6+ 支援 | 早期支援 |
| 適用場景 | 高並發、事務型、混合讀寫 | 唯讀/多讀少寫、全文檢索 |
ALTER TABLE t ENGINE=InnoDB; 鎖表、耗時、丟失原引擎特有屬性(如外鍵)。CREATE TABLE t_new LIKE t_old;
ALTER TABLE t_new ENGINE=InnoDB;
INSERT INTO t_new SELECT * FROM t_old;大表分批事務提交:START TRANSACTION;
INSERT INTO t_new SELECT * FROM t_old WHERE id BETWEEN 1 AND 10000;
COMMIT;InnoDB 主鍵宜短(如自增整型),因二級索引葉子節點存主鍵值,主鍵過大會膨脹所有索引。