企業(yè)網(wǎng)站優(yōu)化電話黑帽友情鏈接
一、MySQL 執(zhí)行引擎
在 MySQL 中,執(zhí)行引擎(存儲(chǔ)引擎,Storage Engine) 是數(shù)據(jù)庫的核心組件之一,負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)、檢索、更新、刪除等底層實(shí)現(xiàn)。
MySQL 中幾種常見的執(zhí)行引擎:
引擎名稱 | 是否支持事務(wù) | 是否支持行級(jí)鎖 | 是否支持外鍵 | 索引類型 | 特點(diǎn)簡述 | 適用場景 |
---|---|---|---|---|---|---|
InnoDB | ? | ? | ? | B+ 樹、全文索引等 | 默認(rèn)引擎,支持事務(wù)、崩潰恢復(fù)、行鎖,多版本控制 (MVCC) | 高并發(fā)寫、事務(wù)場景 |
MyISAM | ? | ? (表鎖) | ? | B+ 樹、全文索引等 | 讀性能好,占用資源少,但不支持事務(wù)和行鎖 | 只讀場景、日志分析 |
Memory | ? | ? (表鎖) | ? | 哈希索引、B+ 樹索引可選 | 數(shù)據(jù)存儲(chǔ)在內(nèi)存中,速度快,重啟即丟數(shù)據(jù) | 緩存臨時(shí)數(shù)據(jù)、排序中間結(jié)果 |
CSV | ? | ? | ? | 無 | 每個(gè)表一個(gè) .csv 文件,便于導(dǎo)入導(dǎo)出 | 簡單數(shù)據(jù)交換場景 |
Archive | ? | ? | ? | 無或極簡索引 | 高壓縮比,適合只寫不讀的歸檔數(shù)據(jù) | 日志歸檔、歷史數(shù)據(jù) |
Federated | ? | ? | ? | 依賴遠(yuǎn)程端索引 | 查詢遠(yuǎn)程服務(wù)器上的表,類似數(shù)據(jù)庫間連接 | 跨庫查詢 |
NDB(Cluster) | ? | ? | ? | 哈希、B+樹 | 分布式存儲(chǔ),適用于 MySQL Cluster,高可用、高冗余 | 高可用集群部署 |
二、執(zhí)行引擎分類
1. InnoDB(默認(rèn))
- 支持事務(wù):ACID、兩階段提交;
- 支持 MVCC:多版本并發(fā)控制;
- 支持外鍵:唯一支持外鍵約束的引擎;
- 行級(jí)鎖:減少鎖沖突,適合并發(fā);
- Crash-safe:配合
redo log
和undo log
; - B+ 樹索引:聚簇索引(主鍵)+ 二級(jí)索引。
適用于大多數(shù)業(yè)務(wù)系統(tǒng),尤其是有事務(wù)需求、并發(fā)高的 OLTP 系統(tǒng)。
2. MyISAM
- 不支持事務(wù)和外鍵;
- 表級(jí)鎖:讀取快,但寫入競爭大;
- 壓縮表支持:MyISAM 表可以壓縮,提高存儲(chǔ)效率;
- 全文索引支持早:在老版本 MySQL 中早于 InnoDB 支持全文索引。
適用于以讀為主的報(bào)表系統(tǒng)或數(shù)據(jù)倉庫,但已逐漸被 InnoDB 替代。
3. Memory(Heap)
- 數(shù)據(jù)存儲(chǔ)在內(nèi)存中;
- 速度極快,但 斷電/重啟即丟數(shù)據(jù);
- 僅表級(jí)鎖;
- 默認(rèn)使用 哈希索引,也可改為 B+ 樹。
適用于臨時(shí)表、排行榜、會(huì)話數(shù)據(jù)等不需要持久化的高速讀寫場景。
4. Archive
- 只支持 INSERT 和 SELECT;
- 高壓縮比、低存儲(chǔ)開銷;
- 不支持索引或只支持 minimal 索引。
適用于日志歸檔、審計(jì)數(shù)據(jù)存儲(chǔ)等寫多讀少的業(yè)務(wù)。
5. Federated
- 表數(shù)據(jù)存在遠(yuǎn)程服務(wù)器;
- 本地僅存連接信息,查詢時(shí)連接遠(yuǎn)端執(zhí)行;
- 不支持事務(wù)、索引依賴遠(yuǎn)程庫。
適用于簡單跨數(shù)據(jù)庫查詢,但存在網(wǎng)絡(luò)延遲和維護(hù)問題。
三、查看和指定執(zhí)行引擎
查看當(dāng)前表的執(zhí)行引擎:
SHOW TABLE STATUS WHERE Name = 'your_table';
或
SHOW CREATE TABLE your_table;
指定表的執(zhí)行引擎:
CREATE TABLE example (id INT PRIMARY KEY,name VARCHAR(50)
) ENGINE = InnoDB;
四、執(zhí)行引擎工作流程
在 MySQL 中,執(zhí)行引擎(準(zhǔn)確說是存儲(chǔ)引擎)的工作流程是在語法層、優(yōu)化層處理完后,如何真正與底層數(shù)據(jù)交互、執(zhí)行具體操作的過程。
1. SQL 執(zhí)行整體流程(與執(zhí)行引擎的關(guān)系)
客戶端 SQL -> 連接層 -> 分析器 -> 優(yōu)化器 -> 執(zhí)行器 -> 執(zhí)行引擎(存儲(chǔ)引擎) -> 磁盤數(shù)據(jù)
執(zhí)行引擎是在執(zhí)行器調(diào)度下,真正執(zhí)行對(duì)數(shù)據(jù)的增刪改查操作的底層組件。
2. 執(zhí)行引擎工作流程(以 InnoDB 為例)
以查詢語句為例:
SELECT * FROM users WHERE id = 1;
執(zhí)行引擎處理流程如下圖所示:
┌──────────────────────────┐
│ 執(zhí)行器 │ ← 解析SQL后決定使用 InnoDB
└────────────┬─────────────┘↓
┌──────────────────────────┐
│ InnoDB 執(zhí)行引擎 │ ← 執(zhí)行器調(diào)用接口,如 row_search_for_mysql()
├──────────────────────────┤
│ 1. 檢查 Buffer Pool │ ← 內(nèi)存中是否已有頁(緩存)
│ 2. 否 → 讀取磁盤頁 → 緩存 │
│ 3. 掃描索引(如 B+ 樹) │ ← 聚簇索引/輔助索引
│ 4. 返回?cái)?shù)據(jù)行 │
└──────────────────────────┘
五、InnoDB 執(zhí)行引擎模塊
模塊 | 功能說明 |
---|---|
Buffer Pool | 內(nèi)存緩存頁:索引頁、數(shù)據(jù)頁、undo頁;優(yōu)先讀取緩存,未命中則從磁盤讀入 |
索引管理器 | 支持聚簇索引(主鍵)和二級(jí)索引(普通索引);B+樹結(jié)構(gòu)快速定位 |
事務(wù)管理器 | 支持 ACID,管理 Redo Log 、Undo Log ;控制 MVCC 和鎖 |
鎖管理器 | 提供行級(jí)鎖、意向鎖、Gap鎖、Next-key鎖等 |
日志管理器 | Redo Log (恢復(fù)),Undo Log (回滾、MVCC),Binlog (復(fù)制) |
文件管理器 | 管理表空間、頁文件、數(shù)據(jù)頁讀寫;協(xié)調(diào)磁盤I/O |
六、不同操作的執(zhí)行流程
1. 查詢(SELECT)
SELECT * FROM users WHERE id = 1;
流程如下:
- 執(zhí)行器調(diào)用 InnoDB;
- 查找 Buffer Pool(緩存頁);
- 若無,磁盤讀取頁;
- 使用聚簇索引/二級(jí)索引定位記錄;
- 返回?cái)?shù)據(jù) + 記錄一致性讀版本(MVCC);
若是
FOR UPDATE
則獲取排他鎖。
2. 插入(INSERT)
INSERT INTO users (name) VALUES ('Alice');
流程:
- 構(gòu)造記錄 → 寫 Buffer Pool;
- 記錄
Undo Log
(用于回滾); - 寫
Redo Log
(prepare); - 提交時(shí)寫
Binlog
+Redo commit
; - 后臺(tái)刷臟頁到磁盤。
3. 更新/刪除(UPDATE / DELETE)
流程類似插入,區(qū)別在于:
- 掃描行 → 檢查可見性(MVCC);
- 修改時(shí)生成 Undo 版本;
- 并在提交前記錄
redo
、binlog
。