本文是《Mysql技术内幕--InnoDB存储引擎》的学习笔记。
本文主要内容是:介绍InnoDB的表的逻辑存储结构。
一、索引组织表
在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table)。索引组织表其实就是存储在一个索引结构中的表。
InnoDB对主键建立聚簇索引。如果你不指定主键,InnoDB会用一个具有唯一且非空值的索引来代替。如果不存在这样的索引,InnoDB会自动创建一个6字节大小的指针作为主键,然后对其建立聚簇索引。
注:如果表中存在多个非空唯一索引时,InnoDB存储引擎将选择建表时第一个定义的非空唯一索引为主键。
二、InnoDB逻辑存储结构
逻辑存储结构如下图:
从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两种格式。