MySQL之InnoDB存储引擎

本文深入探讨了MySQL的InnoDB存储引擎,包括其逻辑存储结构、内存与磁盘架构,以及事务处理原理。重点介绍了Bufferpool、Change Buffer、Adaptive Hash Index和日志缓冲区等内存组件的作用,以及系统表空间、文件表空间、撤销表空间等磁盘结构。同时,文章阐述了事务的原子性、持久性、一致性和隔离性的实现,特别是Redo Log和Undo Log在事务恢复中的关键角色。此外,还提及了MVCC在并发控制中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.逻辑存储结构

下图是InnoDB的逻辑存储结构

2.架构

MySQL5.5版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发中使用广泛。下图是InnoDB架构图,左侧为内存结构,右侧为磁盘结构。

2.1、内存结构

①Buffer pool:在执行增删改查操作时,先操作缓冲池中的数据,(缓冲池没有数据,再去磁盘加载并缓存在缓冲池中),然后再以一定的频率刷新到磁盘中,减少磁盘IO,加快处理速度。

缓冲池以page为单位,底层采用链表数据结构管理page。

②change buffer:更改缓冲区(针对非唯一的二级索引页)。在执行DML语句时,如果数据不存在于Buffer pool,就把数据从磁盘加载到更改缓冲区,在更改缓冲区完成操作后,以一定的频率刷新到Buffer pool,再由Buffer pool刷新到磁盘。二级索引的DML操作是主键乱序插入的,频繁乱序的磁盘IO会大大减低处理速度,这就是change buffer存在的意义。

③Adaptive Hash Index:自适应hash索引,用于优化buffer pool数据的查询。

④log buffer:日志缓冲区。用来保存要写入磁盘的log日志(redo log、undo log),默认为16M,日志缓冲区的日志会定期刷新到磁盘。可以通过增加日志缓冲区的大小来减少磁盘IO。

参数:

innodb_log_buffer_size:缓冲区大小 

innodb_flush_log_at_trx_commit:刷新日志时机(0:每次事务提交时刷新到磁盘;1:每秒刷新到磁盘;2:日志在每次事务提交后写入,并每秒刷新到磁盘)。

2.2、磁盘结构

①system tablespace:系统表空间是更改缓冲区的存储区域。

②file-per-table tablespace:每个表的文件表空间。每一张表都会生成一个独立的表空间文件。

③general tablespaces:通用表空间,默认不存在,但可以手动创建,手动指定关联。

④doublewrite buffer files:双写缓冲区。InnoDB引擎将数据页从buffer pool刷新到磁盘前,先将数据页写入双写缓冲区文件中,便于系统异常时恢复数据。

⑤undo tablespace:撤销表空间,MySQL实例在初始化时会自动创建两个默认的undo表空间(大小默认16M),用于存储undo log。

⑥temporary tablespaces:临时表空间,用于存放临时表等数据。

⑦redo log:重做日志,用来实现事务的持久性。当事务提交之后,会把所有修改信息都存到该日志中,用于在刷新脏页到磁盘发生错误时,进行数据恢复使用。

2.3、后台线程

3.事务原理

3.1、redo log

重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。

3.2、undo log

原子性:undo log

持久性:redo log

一致性:undo log +redo log

隔离性:锁+MVCC

4.MVCC

基本概念:

 三个隐藏字段:

undo log版本链 :

DB_TRX_ID:事务ID(自增)。

DB_ROLL_PTR:回滚指针(指向前一个事务的地址)。

readview :

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值