IT袋

当前位置:主页 > 经验教程 > 硬件教程 >

InnoDB磁盘结构详解

InnoDB磁盘结构详解 深入探究InnoDB的磁盘结构

时间:2023-09-23 23:35:19 来源:IT袋 作者:苏晓敏
导读:InnoDB磁盘结构详解,一个电脑小知识,为大家介绍InnoDB磁盘结构详解方面的内容,具体详情如下: 表空间 磁盘部分包括各种表空间,包括系统表空间(System Tablespace)、独立表空间(File-Pe

InnoDB磁盘结构详解

一个电脑小知识,为大家介绍InnoDB磁盘结构详解方面的内容,具体详情如下:

表空间

磁盘部分包括各种表空间,包括系统表空间(System Tablespace)、独立表空间(File-Per-Table Tablespaces)、undo表空间(Undo Tablespaces)、通用表空间(General Tablespaces)、临时表空间(Temporary TableSpaces)5种表空间。

表空间可以看做是InnoDB存储引擎逻辑结构的最高层 ,所有的数据都是存放在表空间中。InnoDB通过参数InnoDB_file_per_table(DMS是ON)可以选择使用系统表空间还是独立表空间存储表,如果不是ON,则所有InnoDB表都保存在ibdata1这个表文件中,否则一个表占据一个表文件,拥有自己独立的表文件(用户记录、索引和插入缓冲Bitmap),即每个Table单独存储为一个“.ibd”文件,但change buffer等依然存放在系统表空间。

多个段组成一个表空间。常见的段有数据段、索引段、回滚段等,段是一个逻辑的概念,是一些零散页面和一些完整的区的集合。不同类型的数据保存在单独的段内,可以更好的保持该类型数据的连续性,可以提升访问磁盘的效率。创建一个索引会创建数据段和索引段,即一个索引占用两个段。

  • 数据段:B+树的叶子节点(Leaf node segment)
  • 索引段:B+树的非叶子节点(Non-leaf node segment)
  • 回滚段(rollback segment):InnoDB中undo log是采用分段(segment)的方式进行存储的,每一个rollback segment内部由1024个undo segment组成,每个undo Tablespace最多会包含128个rollback segment。每一时刻一个undo segment都是被一个事务独占的,每个写事务都会持有至少一个undo segment,当有大量写事务并发运行时,就需要存在多个undo segment。MySQL 8.0由于支持了最多128个独立的Undo Tablespace,一方面避免了ibdata1的膨胀,方便undo空间回收,另一方面也大大增加了最大的rollback segment的个数,增加了可支持的最大并发写事务数(128*128*1024)。

注意,虽然InnoDB区分了数据段和索引段,但由于数据是以主键为索引来组织数据的存储的,所以索引文件和数据文件都在同一个文件中,都在“.ibd”文件里面。

表空间中的页实在是太多了,为了更好的管理这些页面,InnoDB提出了区的概念。一个表空间划分为多个区(extent),一个区内包含物理上连续的64个页,因此一个区空间大小为64*16KB=1M。区就是为了保证页的连续性,InnoDB一次会从磁盘申请4~5个区。

段可以简单理解为是一个逻辑的概念,而Extent是一个物理概念,每次B+树的扩容都是以Extent为单位来扩容的,默认一次扩容不超过4个Extent。

段区分了数据段和索引段,其实也就有了各自的区,即叶子节点和非叶子节点都有自己独立的区。想象一下,当B+树按顺序范围查询时,如果数据分布在磁盘的不同位置,就会产生随机IO,而如果数据的物理位置相邻,就可以通过顺序IO读取了。

相关阅读