Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL 存储引擎InnoDB

MySQL 存储引擎InnoDB 架构与原理深度解析

作者:JiaHao汤

这篇文章详细介绍了MySQL中InnoDB和MyISAM两种主要存储引擎的特性、区别和使用场景,探讨了InnoDB的页结构、分层存储结构以及其在事务管理、崩溃恢复和并发控制方面的优势,感兴趣的朋友跟随小编一起看看吧

索引结构提供了高效的数据检索方式,索引信息与数据记录均存储于文件系统中,具体而言是存储在页结构中。索引的实现依赖于存储引擎,MySQL 服务器通过存储引擎完成对表数据的读写操作。不同存储引擎的数据存储格式各异,部分存储引擎(如 MEMORY)甚至不使用磁盘存储数据,而是将数据保存在内存中。

MySQL 支持的存储引擎类型

通过以下命令可以查看 MySQL 支持的所有存储引擎:

SHOW ENGINES;

查询结果示例:

存储引擎支持状态说明事务分布式事务保存点
InnoDB默认支持事务、行级锁和外键
MyISAM传统存储引擎,不支持事务
MEMORY基于哈希索引,数据存储于内存,适用于临时表
CSV以 CSV 格式存储数据
ARCHIVE高压缩比的归档存储引擎
BLACKHOLE黑洞存储引擎,写入的数据不会被保存
FEDERATED联邦存储引擎,用于访问远程表
MRG_MYISAMMyISAM 表的集合
PERFORMANCE_SCHEMA性能监控与诊断

默认存储引擎的查看与配置

版本差异

MySQL 在不同版本中采用不同的默认存储引擎:

若在创建表时未显式指定存储引擎,MySQL 将自动使用默认存储引擎。

查看当前 MySQL 版本

SELECT VERSION();

查看默认存储引擎

SHOW VARIABLES LIKE 'default_storage_engine';

查询结果示例(MySQL 5.6.40):

Variable_nameValue
default_storage_engineInnoDB

修改默认存储引擎

[mysqld]
default-storage-engine = InnoDB

重启 MySQL 服务使配置生效:

systemctl restart mysqld.service

方式二:通过 SQL 命令修改(会话级别)

SET default_storage_engine = MyISAM;

主要存储引擎特性对比

各存储引擎核心特性

核心区别:InnoDB 与 MyISAM 的三大关键差异在于事务支持、外键约束和行级锁定。

功能特性对比表

功能MyISAMMEMORYInnoDB
存储限制258 TBRAM64 TB
事务支持××
全文索引支持×√(5.6+)
B 树索引支持
哈希索引支持×√(自适应)
集群索引支持××
数据索引支持×
数据压缩支持××
空间使用率N/A
外键支持××

InnoDB 与 MyISAM 存储引擎对比分析

InnoDB 存储引擎

InnoDB 提供了完善的事务管理、崩溃恢复能力和并发控制机制。其主要优势在于:

  1. 事务完整性:支持 ACID 特性,适用于对数据一致性要求较高的应用场景,特别是涉及频繁更新和删除操作的业务系统
  2. 并发性能:支持行级锁定,能够有效处理高并发访问场景,避免表级锁带来的性能瓶颈
  3. 数据安全性:提供崩溃恢复功能,服务器异常重启后能够自动恢复已提交的事务并回滚未提交的操作

主要劣势:

MyISAM 存储引擎

MyISAM 适用于以读取和插入操作为主、更新和删除操作较少且对事务要求不高的系统。其主要优势在于:

  1. 查询性能:在数据量较小的情况下,读写效率优于 InnoDB
  2. 存储效率:磁盘空间占用相对较少

主要劣势:

选型建议

InnoDB 是处理大规模数据的首选存储引擎。除非存在特殊的业务需求,否则应优先选择 InnoDB 存储引擎。

InnoDB 核心优势

表级存储引擎操作

操作描述SQL 语句
查看表的存储引擎SHOW TABLE STATUS LIKE 表名称;
创建表时指定存储引擎CREATE TABLE 表名称 (…) ENGINE = 存储引擎名称;
修改表的存储引擎ALTER TABLE 表名称 ENGINE = 存储引擎名称;
查看数据库所有表的存储引擎SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ‘数据库名称’;
查看表的创建语句(包括存储引擎)SHOW CREATE TABLE 表名称;

InnoDB 存储引擎架构

页:磁盘与内存交互的基本单位

InnoDB 将数据划分为若干个页(Page),默认页大小为 16KB。页是磁盘与内存之间数据交换的基本单位,即每次至少从磁盘读取 16KB 数据到内存,或将内存中的 16KB 数据刷新到磁盘。

设计原理:数据库不以行为单位进行读取,否则每次磁盘 I/O 操作仅能处理一行数据,效率极低。

在数据库系统中,无论读取一行还是多行数据,都会将这些行所在的整个页加载到内存。因此,页是数据库管理存储空间和执行 I/O 操作的最小单位,一个页可以存储多行记录。

不同数据库系统的页大小

查看 InnoDB 页大小:

SHOW VARIABLES LIKE '%innodb_page_size%';

查询结果默认为 16384 字节,即 16KB。

页结构组织方式

页之间通过双向链表关联,无需在物理结构上连续存储。每个数据页内部的记录按主键值从小到大组成单向链表。为了提高查询效率,每个数据页会为其中的记录生成页目录(Page Directory),通过主键查找记录时,可以在页目录中使用二分查找法快速定位到对应的槽(Slot),然后遍历该槽对应分组中的记录即可快速找到目标记录。

InnoDB 存储结构层次

InnoDB 采用分层的存储结构,从小到大依次为:行(Row)、页(Page)、区(Extent)、段(Segment)、表空间(Tablespace)。

存储结构层次关系

区(Extent)

区是比页更高一级的存储结构。在 InnoDB 中,一个区包含 64 个连续的页。由于页的默认大小为 16KB,因此一个区的大小为 64 × 16KB = 1024KB = 1MB。

段(Segment)

段由一个或多个区组成。区在文件系统中是连续分配的空间(在 InnoDB 中为连续的 64 个页),但段中的区之间无需相邻。段是数据库的分配单位,不同类型的数据库对象以不同的段形式存在。创建表时会创建表段,创建索引时会创建索引段。

根据存储内容和用途的不同,InnoDB 中的段主要分为以下三种类型:

1. 数据段(Data Segment / Leaf Node Segment)

数据段用于存储表的实际数据行,对应 B+ 树索引结构的叶子节点。

2. 索引段(Index Segment / Non-Leaf Node Segment)

索引段用于存储索引的非叶子节点数据,对应 B+ 树索引结构的内部节点。

3. 回滚段(Rollback Segment / Undo Segment)

回滚段用于存储事务的回滚信息(Undo Log),是 InnoDB 事务机制的核心组件。

三种段的协同工作

段类型对比表

特性数据段索引段回滚段
存储内容完整的行数据索引键值和指针数据修改前的旧版本
对应结构B+ 树叶子节点B+ 树非叶子节点Undo Log
主要用途存储表数据加速数据检索事务回滚和 MVCC
创建时机创建表时创建索引时事务修改数据时
生命周期与表同生命周期与索引同生命周期事务提交后可清理
访问频率高(数据查询)高(索引查询)中(事务回滚、MVCC)

表空间(Tablespace)

表空间是逻辑容器,用于存储段。一个表空间可以包含一个或多个段,但一个段只能属于一个表空间。数据库由一个或多个表空间组成,表空间从管理角度可划分为系统表空间、用户表空间、撤销表空间、临时表空间等。

到此这篇关于MySQL 存储引擎InnoDB 架构与原理深度解析的文章就介绍到这了,更多相关MySQL 存储引擎InnoDB内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文