InnoDB存储引擎的表的逻辑存储结构

本文是《Mysql技术内幕--InnoDB存储引擎》的学习笔记。

本文主要内容是:介绍InnoDB的表的逻辑存储结构。

一、索引组织表

在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table)。索引组织表其实就是存储在一个索引结构中的表。

InnoDB对主键建立聚簇索引。如果你不指定主键,InnoDB会用一个具有唯一且非空值的索引来代替。如果不存在这样的索引,InnoDB会自动创建一个6字节大小的指针作为主键,然后对其建立聚簇索引。

注:如果表中存在多个非空唯一索引时,InnoDB存储引擎将选择建表时第一个定义的非空唯一索引为主键。

二、InnoDB逻辑存储结构

逻辑存储结构如下图:

5679451-7f6c9391bd656121.png

从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称为表空间。表空间又由段(segment)、区(extent)、页(page)组成。页在一些文档中有时也称为块(block)。

2.1 表空间

表空间可以看做时InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。默认情况下InnoDB只有一个共享表空间ibdata1,即所有的数据都存放在这个表空间中。如果用户启用了innodb_file_per_table,则每张表内的数据可以单独放到一个表空间内。

需要注意的是,启用了innodb_file_per_table参数,每张表的表空间内存放的只是数据、索引和插入缓冲Bitmap页,其他类的数据,如回滚信息,插入缓冲索引页、系统事务信息,二次写缓冲等还是存放在原来的共享表空间内。

2.2段

表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等。因为InnoDB引擎表是索引组织的,因此数据即索引,索引即数据。那么数据段即为B+树的叶子结点,索引段即为B+树的非叶子结点。

2.3区

区是由连续页组成的空间,在任何情况下每个区的大小都为1MB。为了保证区中页的连续性,InnoDB一次从磁盘申请4-5个区。在默认情况下,InnoDB存储引擎页的大小为16KB,即一个区中一共有64个连续的页。

2.4页

页是InnoDB磁盘管理的最小单位,在InnoDB存储引擎中,默认每个页的大小为16KB。
在InnoDB存储引擎中,常见的页类型有:

数据页
undo页
系统页
事务数据页
插入缓冲位图页
插入缓冲空闲列表页
未压缩的二进制大对象页
压缩的二进制大对象页

2.5行

nnoDB数据是按照行进行存放的。每个页存放的行记录也是有硬性定义的,最多允许存放16KB/ 2 - 200行的记录,即7992行记录。

行又分为Compact和Redundant两种格式。