数据库学习(七)——MySQL执行引擎
一、MySQL 执行引擎
在 MySQL 中,执行引擎(存储引擎,Storage Engine) 是数据库的核心组件之一,负责数据的存储、检索、更新、删除等底层实现。
MySQL 中几种常见的执行引擎:
引擎名称 | 是否支持事务 | 是否支持行级锁 | 是否支持外键 | 索引类型 | 特点简述 | 适用场景 |
---|---|---|---|---|---|---|
InnoDB | ✅ | ✅ | ✅ | B+ 树、全文索引等 | 默认引擎,支持事务、崩溃恢复、行锁,多版本控制 (MVCC) | 高并发写、事务场景 |
MyISAM | ❌ | ❌ (表锁) | ❌ | B+ 树、全文索引等 | 读性能好,占用资源少,但不支持事务和行锁 | 只读场景、日志分析 |
Memory | ❌ | ❌ (表锁) | ❌ | 哈希索引、B+ 树索引可选 | 数据存储在内存中,速度快,重启即丢数据 | 缓存临时数据、排序中间结果 |
CSV | ❌ | ❌ | ❌ | 无 | 每个表一个 .csv 文件,便于导入导出 | 简单数据交换场景 |
Archive | ❌ | ❌ | ❌ | 无或极简索引 | 高压缩比,适合只写不读的归档数据 | 日志归档、历史数据 |
Federated | ❌ | ❌ | ❌ | 依赖远程端索引 | 查询远程服务器上的表,类似数据库间连接 | 跨库查询 |
NDB(Cluster) | ✅ | ✅ | ✅ | 哈希、B+树 | 分布式存储,适用于 MySQL Cluster,高可用、高冗余 | 高可用集群部署 |
二、执行引擎分类
1. InnoDB(默认)
- 支持事务:ACID、两阶段提交;
- 支持 MVCC:多版本并发控制;
- 支持外键:唯一支持外键约束的引擎;
- 行级锁:减少锁冲突,适合并发;
- Crash-safe:配合
redo log
和undo log
; - B+ 树索引:聚簇索引(主键)+ 二级索引。
适用于大多数业务系统,尤其是有事务需求、并发高的 OLTP 系统。
2. MyISAM
- 不支持事务和外键;
- 表级锁:读取快,但写入竞争大;
- 压缩表支持:MyISAM 表可以压缩,提高存储效率;
- 全文索引支持早:在老版本 MySQL 中早于 InnoDB 支持全文索引。
适用于以读为主的报表系统或数据仓库,但已逐渐被 InnoDB 替代。
3. Memory(Heap)
- 数据存储在内存中;
- 速度极快,但 断电/重启即丢数据;
- 仅表级锁;
- 默认使用 哈希索引,也可改为 B+ 树。
适用于临时表、排行榜、会话数据等不需要持久化的高速读写场景。
4. Archive
- 只支持 INSERT 和 SELECT;
- 高压缩比、低存储开销;
- 不支持索引或只支持 minimal 索引。
适用于日志归档、审计数据存储等写多读少的业务。
5. Federated
- 表数据存在远程服务器;
- 本地仅存连接信息,查询时连接远端执行;
- 不支持事务、索引依赖远程库。
适用于简单跨数据库查询,但存在网络延迟和维护问题。
三、查看和指定执行引擎
查看当前表的执行引擎:
SHOW TABLE STATUS WHERE Name = 'your_table';
或
SHOW CREATE TABLE your_table;
指定表的执行引擎:
CREATE TABLE example (id INT PRIMARY KEY,name VARCHAR(50)
) ENGINE = InnoDB;
四、执行引擎工作流程
在 MySQL 中,执行引擎(准确说是存储引擎)的工作流程是在语法层、优化层处理完后,如何真正与底层数据交互、执行具体操作的过程。
1. SQL 执行整体流程(与执行引擎的关系)
客户端 SQL -> 连接层 -> 分析器 -> 优化器 -> 执行器 -> 执行引擎(存储引擎) -> 磁盘数据
执行引擎是在执行器调度下,真正执行对数据的增删改查操作的底层组件。
2. 执行引擎工作流程(以 InnoDB 为例)
以查询语句为例:
SELECT * FROM users WHERE id = 1;
执行引擎处理流程如下图所示:
┌──────────────────────────┐
│ 执行器 │ ← 解析SQL后决定使用 InnoDB
└────────────┬─────────────┘↓
┌──────────────────────────┐
│ InnoDB 执行引擎 │ ← 执行器调用接口,如 row_search_for_mysql()
├──────────────────────────┤
│ 1. 检查 Buffer Pool │ ← 内存中是否已有页(缓存)
│ 2. 否 → 读取磁盘页 → 缓存 │
│ 3. 扫描索引(如 B+ 树) │ ← 聚簇索引/辅助索引
│ 4. 返回数据行 │
└──────────────────────────┘
五、InnoDB 执行引擎模块
模块 | 功能说明 |
---|---|
Buffer Pool | 内存缓存页:索引页、数据页、undo页;优先读取缓存,未命中则从磁盘读入 |
索引管理器 | 支持聚簇索引(主键)和二级索引(普通索引);B+树结构快速定位 |
事务管理器 | 支持 ACID,管理 Redo Log 、Undo Log ;控制 MVCC 和锁 |
锁管理器 | 提供行级锁、意向锁、Gap锁、Next-key锁等 |
日志管理器 | Redo Log (恢复),Undo Log (回滚、MVCC),Binlog (复制) |
文件管理器 | 管理表空间、页文件、数据页读写;协调磁盘I/O |
六、不同操作的执行流程
1. 查询(SELECT)
SELECT * FROM users WHERE id = 1;
流程如下:
- 执行器调用 InnoDB;
- 查找 Buffer Pool(缓存页);
- 若无,磁盘读取页;
- 使用聚簇索引/二级索引定位记录;
- 返回数据 + 记录一致性读版本(MVCC);
若是
FOR UPDATE
则获取排他锁。
2. 插入(INSERT)
INSERT INTO users (name) VALUES ('Alice');
流程:
- 构造记录 → 写 Buffer Pool;
- 记录
Undo Log
(用于回滚); - 写
Redo Log
(prepare); - 提交时写
Binlog
+Redo commit
; - 后台刷脏页到磁盘。
3. 更新/删除(UPDATE / DELETE)
流程类似插入,区别在于:
- 扫描行 → 检查可见性(MVCC);
- 修改时生成 Undo 版本;
- 并在提交前记录
redo
、binlog
。