InnoDB存储引擎

图片替换文本

InnoDB存储引擎的存储结构

空间( filespace)
空间是由文件所组成的链表,空间中的文件有一定的顺序。每个空间
用一个空间id来标识。id=0 的空间是系统表空间。
空间可以分为三类:

  1. 表空间:保存的是数据库文件;
  2. 日志空间:保存的是日志文件;
  3. 日志备份空间:保存的是日志文件的备份。
图片替换文本

系统表空间(共享表空间)

InnoDB系统表空间由配置文件中的选项参数InnoDB_data_file_path = /ibdata/ibdata1:10M:autoextend(默认)指定的数据文件组成。这些数据文件组成了系统表空间。在新创建的系统表空间中,InnoDB将从第一个数据文件开始分配空间。
InnoDB系统表空间包含InnoDB数据字典,表数据页,表索引页,Undo空间,回滚段,双写缓冲区,插入缓冲等。
系统表空间也默认包含任何用户在系统表空间创建的表数据和索引数据。

单表单文件表空间(File-Per-Table Tablespaces)(独立表空间)

为了避免在系统表空间中存储所有表和索引,可以启用innodb_file_per_table配置选项(默认值)
单表单文件特性提供了一个更加灵活的选择,每个表的数据都存储在自己的表空间数据文件(.ibd)里。启用了这个参数,每张表的表空间内存放的只是数据、索引和插入缓冲页,其他类型的数据还是存放在共享表空间内。

段(Segment)

段是磁盘上空间分配和回收的申请者,是一个逻辑概念,用来管理物理文件。常见的段有数据段、索引段、回滚段等。段是为了保持叶子节点在磁盘上的连续,可以实现更好的顺序I/O操作,因为这些叶子节点包含实际的表数据。
在InnoDB中会为每个索引分配两个段,一个段对应B+树的非叶子节点(索引段),另一个对应叶子节点(数据段)。

区(Extend)

区是构成段的基本元素,一个段由若干个区构成,一个区是物理上连续分配的一段空间,每个段至少会有一个区。
一个段的物理空间是无限的,扩展的最小单位是区,区的空间大小是固定的一般是64个页面。

页(Page)

Page是整个InnoDB存储的最基本构件,也是InnoDB磁盘管理的最小单位(MySQL与磁盘交互的最小单位,默认大小16KB,最多存放7992行记录,一般真是场景中一行数据大约1KB,一页数据也就16行左右,B+树的节点就是页),与数据库相关的所有内容都存储在这种Page结构里。

InnoDB存储引擎数据读写流程

  1. Buffer Pool 缓存数据页,客户端查询时首先在Buffer pool中查询,当缓存页中没有时再到数据文件中查询
  2. 当写文件时首先写入Buffer Pool和Redo log文件中,根据设置是否进行刷盘和刷盘方式
  3. 数据库脏页刷盘采用double write ,保证原子写入成功
    图片替换文本

脏页与刷盘
在innodb中处理用户查询后,其结果在内存空间的缓冲池已经发生变化,但是还未记录到磁盘。这种页面称为脏页,将脏页记录到磁盘的过程称为刷脏。
刷脏分两种算法:

  1. flush-list(依据时间管理缓冲池中更改页面的列表)
  2. LRU-list(用于管理缓冲池中非常用页面的列表)

事务提交后,InnoDB首先在缓冲池中找到对应的页,把事务更新到缓冲区中.当刷新脏页到磁盘时,缓冲区把脏页拷贝到double write buffer,doublewirte buffer把脏页刷新到double write磁盘(这也是一次顺序IO),再把脏页刷新到数据文件中

MySQL双写
目的:防止页损坏
原理:在内存中开辟了 doublewrite buffer 内存空间(2M),将脏页复制到doublewrite buffer 内存空间后, 先把doublewrite buffer的页数据写入到共享表空间ibdata1磁盘上,复制了页的副本完成之后, 再将 doublewrite buffer的页数据写入到各个表空间文件中。
数据页默认16k,一次写入512字节,防止页损坏,doublewrite产生了页副本,用于恢复页, 然后redo 在恢复的页上重做一遍日志

redo buffer和redo file 都是512字节大小,一次写入也是512字节,原子写,所以不需要doublewrite

posted @ 2021-03-13 10:40  Abserver  阅读(118)  评论(0)    收藏  举报