表空间文件组成结构
InnoDB存储引擎按照表空间进行管理。
在新建一个数据时,InnoDB存储引擎会初始化一个名为ibdata1的表空间文件。
默认情况下,这个文件会存储所有表的数据,以及我们所熟知但是看不到的SYS_TABLES, SYS_COLUMNS, SYS_INDEXES, SYS_FIELDS等。
此外,还用来存储保证数据完整性的的回滚端数据。
可以通过设置InnoDB_file_per_table来设置,使得每一个表都对应一个独立的表空间文件。
段
段是表空间文件的主要组织结构,它是一个逻辑概念,用来管理物理文件,是构成索引、表、回滚段的基本元素。
创建一个索引(B+)树的同时,会创建两个段,分别是内节点段和叶子节点段。
索引数据量一直在增长过程中,所有新的存储空间的申请,都是从段这个逻辑概念中申请的。
更形象的说,ibd文件就是由多个端组成的,没有任何其他空间是脱离了段的管理的。
簇
我们已经知道,一个索引由两个段组成,段是一个逻辑概念。段中的组织结构师什么样子?InnoDB引入了簇的概念,在代码中是Extent。
簇是构成段的基本元素,一个段有若干个簇构成。
一个簇是物理上连续分配的一段空间,每一个段至少会有一个簇,在创建一个段时会创建一个默认的簇。
如果存储数据时,一个簇已经不足以存储更多的数据,此时需要从这个段中分配一个新的簇来存放新的数据。
簇的空间大小是固定的,一般是64个页。
一个索引由两个段组成,两个段之间的物理位置是没有关系的。每个段由若干个簇组成,多个簇的物理位置也是没有关系的,但是会有指针连接。
页面
我们已经知道段和簇的关系了。但是簇的物理空间内部还需要继续被切分并高效管理。
页面就是簇被细分后的产物,它是组成簇的基本单位。
页面是段所管理的最小单位,也是数据库文件管理的最小单位,当然也是文件中空间分配的最小单位。
一个簇中可以包括多个页面,默认是64个。
在一个簇中,逻辑上这些页面号都是从小到大连续的,物理上也是连续的。
每一个页面的默认大小是16K。