四、表
数据在表中是如何组合字和存放的。
4.1 索引组织表
在InnoDB 存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table)。在InnoDB存储引擎表中,每张表都有个主键,如果在创建表时没有显式地定义主键,则InnoDB存储引擎会按如下方式选择或创建主键:
- 首先判断表中是否有非空的唯一索引,如果有,则该列即为主键
- 如果不符合上述条件,InnoDB存储引擎自动创建一个6字节大小的指针
当表中有多个非空唯一索引时,InnoDB存储引擎将选择建表时第一个定义的非空唯一索引引为主键。这里需要注意的是:主键的选择根据的是定义索引的顺序,而不是建表时列的顺序。
4.2 InnoDB 逻辑存储结构
表空间(tablespace):由段(segment)、区(extent)、页(page)组成。页在一些文档有时也称为块(block)
1)表空间
如果启用了 innodb_file_per_table 的参数,需要注意的是每张表的表空间内存放的只是数据、索引和插入缓冲 Bitmap 页,其他类的数据,如回滚(undo)信息,插入缓冲索引页、系统事务信息,二次写缓冲等还是存放在原来的共享表空间内。
2)段
常见的段有数据段,索引段,回滚段等
3)区
区由连续页组成的空间,在任何情况下每个区的大小都为1MB。为了保证区中页的连续性,InnoDB存储引擎一次从磁盘申请4~5个区。在默认情况下,InnoDB存储引擎页的大小为16KB,即一个区中一共有64个连续的页。
4)页
页是InnoDB磁盘管理的最小单位。默认16KB
常见页类型:
- 数据页
- undo页
- 系统页
- 事务数据页
- 插入缓冲位图页
- 插入缓冲空闲列表页
- 未压缩的二进制大对象页
- 压缩的二进制大对象页
5)行
Redundant格式是为兼容之前版本而保留的
Compact是为高效地存储数据
4.4 InnoDB数据页结构
- File Header(文件头)
- Page Header(页头)
- Infimum 和 Supremum Records
- User Records(用户记录,即行记录)
- Free Space(空闲空间)
- Page Directory(页目录)
- File Trailer(文件结尾信息)