当前位置: 首页 > news >正文

数据库学习(七)——MySQL执行引擎

一、MySQL 执行引擎

在 MySQL 中,执行引擎(存储引擎,Storage Engine) 是数据库的核心组件之一,负责数据的存储、检索、更新、删除等底层实现。

MySQL 中几种常见的执行引擎:

引擎名称是否支持事务是否支持行级锁是否支持外键索引类型特点简述适用场景
InnoDBB+ 树、全文索引等默认引擎,支持事务、崩溃恢复、行锁,多版本控制 (MVCC)高并发写事务场景
MyISAM❌ (表锁)B+ 树、全文索引等读性能好,占用资源少,但不支持事务和行锁只读场景、日志分析
Memory❌ (表锁)哈希索引、B+ 树索引可选数据存储在内存中,速度快,重启即丢数据缓存临时数据、排序中间结果
CSV每个表一个 .csv 文件,便于导入导出简单数据交换场景
Archive无或极简索引高压缩比,适合只写不读的归档数据日志归档、历史数据
Federated依赖远程端索引查询远程服务器上的表,类似数据库间连接跨库查询
NDB(Cluster)哈希、B+树分布式存储,适用于 MySQL Cluster,高可用、高冗余高可用集群部署

二、执行引擎分类

1. InnoDB(默认)

  • 支持事务:ACID、两阶段提交;
  • 支持 MVCC:多版本并发控制;
  • 支持外键:唯一支持外键约束的引擎;
  • 行级锁:减少锁冲突,适合并发;
  • Crash-safe:配合 redo logundo log
  • B+ 树索引聚簇索引(主键)+ 二级索引

适用于大多数业务系统,尤其是有事务需求、并发高的 OLTP 系统。

2. MyISAM

  • 不支持事务和外键
  • 表级锁读取快,但写入竞争大;
  • 压缩表支持:MyISAM 表可以压缩,提高存储效率;
  • 全文索引支持早:在老版本 MySQL 中早于 InnoDB 支持全文索引。

适用于以读为主的报表系统或数据仓库,但已逐渐被 InnoDB 替代。

3. Memory(Heap)

  • 数据存储在内存中
  • 速度极快,但 断电/重启即丢数据
  • 仅表级锁
  • 默认使用 哈希索引,也可改为 B+ 树。

适用于临时表、排行榜、会话数据等不需要持久化的高速读写场景

4. Archive

  • 只支持 INSERTSELECT
  • 高压缩比、低存储开销
  • 不支持索引或只支持 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 LogUndo Log;控制 MVCC 和锁
锁管理器提供行级锁、意向锁、Gap锁、Next-key锁等
日志管理器Redo Log(恢复),Undo Log(回滚、MVCC),Binlog(复制)
文件管理器管理表空间、页文件、数据页读写;协调磁盘I/O

六、不同操作的执行流程

1. 查询(SELECT)

SELECT * FROM users WHERE id = 1;

流程如下:

  1. 执行器调用 InnoDB;
  2. 查找 Buffer Pool(缓存页)
  3. 若无,磁盘读取页;
  4. 使用聚簇索引/二级索引定位记录;
  5. 返回数据 + 记录一致性读版本(MVCC);

若是 FOR UPDATE 则获取排他锁。

2. 插入(INSERT)

INSERT INTO users (name) VALUES ('Alice');

流程:

  1. 构造记录 → 写 Buffer Pool;
  2. 记录 Undo Log用于回滚);
  3. Redo Logprepare);
  4. 提交时写 Binlog + Redo commit
  5. 后台刷脏页到磁盘。

3. 更新/删除(UPDATE / DELETE)

流程类似插入,区别在于:

  • 扫描行 → 检查可见性(MVCC);
  • 修改时生成 Undo 版本
  • 并在提交前记录 redobinlog

相关文章:

  • DeepSeek提示词指南:从基础到高阶的全面解析
  • LlamaRL 大规模分布式异步强化学习框架
  • Leetcode 3585. Find Weighted Median Node in Tree
  • 【python深度学习】Day 54 Inception网络及其思考
  • 基于C#部署YOLOv5目标检测模型核心技术深度解析
  • 如何让DeepSeek-R1-Distill-Qwen-32B支持Function calling
  • Hudi 与 Hive 集成
  • 阿里开源的MaskSearch:教AI学会“自己找答案”的魔法书
  • 域与对象的生命周期
  • WSL备份与还原
  • Python函数基础知识(2/3)
  • SAP顾问职位汇总(第24周)
  • IDA动态调试环境配置全流程
  • Arduino入门教程:6、计时与定时
  • [从0到1]环境准备--anaconda与pycharm的安装
  • NodeJS怎么通过集群提高NodeJS的性能
  • 第一章 绪论
  • leetcode138-随机链表的复制
  • 《k8s 部署》常见报错类型1
  • 前端面试九之Vue Router
  • 专门做鞋子的网站有哪些/品牌运营策划方案
  • 校园网站设计毕业论文1000字/seo搜索引擎优化费用
  • 昆明网站建设咨询/360优化大师下载安装
  • 中国城乡住房建设厅网站首页/站长之家查询域名
  • 老干局网站建设方案/职业培训网
  • 汕头个人建站模板/汕头网站建设开发