InnoDB 表
大约 2 分钟MysqlMysqlMysql 技术内幕
InnoDB 表
1 索引组织表
在 InnoDB 存储引擎中,表都是根据主键的顺序存放的,这种存储方式成为索引组织表。如果没有显示定义主键,如果有非空的唯一索引,将第一个定义为主键,否则自动创建一个 6 字节大小的指针。
2 逻辑存储结构
InnoDB所有的数据存放在表空间 Tablespace
中,并空间又由 段 segment
、区 extent
、页 page
组成。

2.1 表空间
所有的数据的存放在表空间,数据、索引、插入缓存 Bitmap 页。
对于回滚信息、插入缓存索引页、系统事务信息、二次写缓存等会放在共享表空间内。
段
数据段
索引段
回滚段
区
- 区由连续的页组成,大小固定为 1 MB。
页
- 页是 InnoDB 磁盘管理的最小单位,默认每个页大小为 16 KB,也可以通过配置设置修改。
行
- 数据是按行的形式存储的。
2.2 存储格式
Compact 行记录格式:

首部是一个非 NULL 变长字段长度列表,按照列的顺序逆序防止。
NULL 标志位用来标志每个列是否是空值。
记录头信息。
事务 ID 列、回滚指针列。
主键列(如果没有显示定义主键)。
数据列。
2.3 行溢出数据
将一条记录中的默写数据存储在真正的数据页面外,InnoDB 会将大于指定字节大小的数据放在单独的 BLOB Page 中。

3 约束
关系型数据库可以保证存储数据的完整性,不需要应用程序的控制。
3.1 类型
定义特定数据类型约束
主键约束
唯一键约束
外键约束
触发器约束
4 分区
将一个表或所以分解为更小的可管理的部分,但是在访问数据库的时候,在逻辑上仍然是一个表,在物理上可能由多个分区组成。
Mysql 数据库支持水平分区,还不支持垂直分区。水平分区是指将同一表中的不同行的记录分配到不同的物理文件中,垂直分区是指将同一表中的不同列的记录分配到不同的物理文件中。
Mysql 的分区是局部分区索引,每个分区中存放了索引和数据。对于全局分区是指数据存放在不同的分区中,但是所有的索引放在一个对象中。
4.1 分区类型
- Range分区:基于一个给定连续区间的列值放入分区中。
- List分区: 离散值区间。
- HASH分区:根据用户定义的表达式的返回值进行分区。
- KEY分区:根据Mysql提供的哈希函数分区。