在innodb启动的时候,如果是新建数据库,则需要初始化库,所以首先需要做的就是创建字典管理的B+树等信息,在这些初始化操作之后,就通过函数dict_boot加载常驻内存的四个系统表并读取一些其他信息;
4、rowid管理:
在innodb中,用户表中的记录不一定都会有一个rowid列,rowid只有在一个表没有定义主键时,也就是需要rowid作为聚簇索引列的时候才会被分配给这个表。而rowid的管理分配,并不是一个表独享一个ID空间,而是全局的,所有表都共享这个ID号;
三、innodb数据存储结构
1、表空间文件组成结构
innodb存储引擎在存储设计上模仿了Oracle的存储结构,其数据是按照表空间进行管理的。新建一个数据库时,innodb存储引擎会初始化一个名为ibdata1 的表空间文件,默认情况下,这个文件会存储所有表的数据,以及我们所熟知但看不到的系统表sys_tables、sys_columns、sys_indexes 、sys_fields等。此外,还会存储用来保证数据完整性的回滚段数据,当然这部分数据在新版本的MySQL中,已经可以通过参数来设置回滚段的存储位置了;
innodb存储引擎的设计很灵活,可以通过参数innodb_file_per_table来设置,使得每一个表都对应一个自己的独立表空间文件,而不是存储到公共的ibdata1文件中。独立的表空间文件之存储对应表的B+树数据、索引和插入缓冲等信息,其余信息还是存储在默认表空间中。
这个文件所存储的内容主要就是B+树(索引),一个表可以有多个索引,也就是在一个文件中,可以存储多个索引,而如果一个表没有索引的话,用来存储数据的被称为聚簇索引,也就是说这也是一个索引。最终的结论是,ibd文件存储的就是一个表的所有索引数据;
2、段:
段是表空间文件中的主要组织结构,它是一个逻辑概念,用来管理物理文件,是构成索引、表、回滚段的基本元素。创建一个索引(B+树)时会同时创建两个段,分别是内节点段和叶子段,内节点段用来管理(存储)B+树非叶子(页面)的数据,叶子段用来管理(存储)B+树叶子节点的数据;也就是说,在索引数据量一直增长的过程中,所有新的存储空间的申请,都是从“段”这个概念中申请的。一个索引,包括两个段,那么一个表的段的数目就是索引的个数乘以2了。(更形象的解释:ibd文件,就是由多个段组成的,没有任何其他空间是脱离了段的管理。)
3、簇:
innodb引入了簇的概念,在代码中被称为extent;
簇是构成段的基本元素,一个段由若干个簇构成。一个簇是物理上连续分配的一个段空间,每一个段至少会有一个簇,在创建一个段时会创建一个默认的簇。如果存储数据时,一个簇已经不足以放下更多的数据,此时需要从这个段中分配一个新的簇来存放新的数据。一个段所管理的空间大小是无限的,可以一直扩展下去,但是扩展的最小单位就是簇。簇的空间大小是固定的,一般是64个页面;(簇是实际的物理存储空间)
4、页面:
“页面”是簇细分之后的产物,它是簇的组成单位,也是段所管理的最小单位、数据文件管理的最小单位,当然也是文件中空间分配的最小单位。
一个簇中可以包括多个页面(默认为64个页面,每个页面是16KB),这个页面数通常被叫做“簇的大小”。这些页面都归这个簇管理,在逻辑上(页面号都是从小到大连续的)及物理上都是连续的。在向表中插入数据时,如果一个页面已经被写完,系统会从当前簇中分配一个新的空闲页面处理使用,如果当前簇中的64个页面都被分配完,系统会从当前页面所在段中分配一个新的簇,然后再从这个簇中分配一个新的页面来使用;(更简单的说:表空间文件就是被划分成相等长度的块,每一个块就是一个页面,一个页面默认为16KB,一个文件中没有任何空间是脱离了段的管理而存在的)
---注意:没有任何空间不是一页面的形式而存在的。
5、段、簇、页面组织结构: