1.逻辑存储结构

image.png
1). 表空间
表空间是InnoDB存储引擎逻辑结构的最高层, 如果用户启用了参数 innodb_file_per_table(在 8.0版本中默认开启) ,则每张表都会有一个表空间(xxx.ibd),一个mysql实例可以对应多个表空 间,用于存储记录、索引等数据。
2). 段
段,分为数据段(Leaf node segment)、索引段(Non-leaf node segment)、回滚段 (Rollback segment),InnoDB是索引组织表,数据段就是B+树的叶子节点, 索引段即为B+树的非叶子节点。段用来管理多个Extent(区)。
3). 区
区,表空间的单元结构,每个区的大小为1M。 默认情况下, InnoDB存储引擎页大小为16K, 即一 个区中一共有64个连续的页
4). 页
页,是InnoDB 存储引擎磁盘管理的最小单元,每个页的大小默认为 16KB。为了保证页的连续性, InnoDB 存储引擎每次从磁盘申请 4-5 个区
5). 行
行,InnoDB 存储引擎数据是按行进行存放的。 在行中,默认有两个隐藏字段: Trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列。 Roll_pointer:每次对某条引记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。

2.架构

InnoDB架构图,左侧为内存结构,右侧为磁盘结构。
image.png

2.1.内存结构

  1. Buffer Pool

image.png

  1. Change Buffer

image.png

  1. Adaptive Hash Index

image.png

  1. Log Buffer

image.png

2.2.磁盘结构

image.png

2.3.后台线程

image.png
在InnoDB的后台线程中,分为4类,分别是:Master Thread 、IO Thread、Purge Thread、 Page Cleaner Thread。
image.png

3.事务原理

image.png
image.png

3.1.redo log

image.pngimage.png

3.2.undo log

image.png

3.3.MVCC

image.png
image.png
image.png

3.3.1.隐藏字段

image.png
image.png

3.3.2.undo log

image.png
image.png

3.3.3.readView

image.png

3.4.原理分析

3.4.1.RC隔离级别

image.png

3.4.2.RR隔离级别

image.png

3.5.总结

image.png