跳至主要內容

InnoDB 表

blacklad大约 2 分钟MysqlMysqlMysql 技术内幕

InnoDB 表

1 索引组织表

在 InnoDB 存储引擎中,表都是根据主键的顺序存放的,这种存储方式成为索引组织表。如果没有显示定义主键,如果有非空的唯一索引,将第一个定义为主键,否则自动创建一个 6 字节大小的指针。

2 逻辑存储结构

InnoDB所有的数据存放在表空间 Tablespace 中,并空间又由 段 segment、区 extent、页 page 组成。

2.1 表空间

所有的数据的存放在表空间,数据、索引、插入缓存 Bitmap 页。

对于回滚信息、插入缓存索引页、系统事务信息、二次写缓存等会放在共享表空间内。

  1. 数据段

  2. 索引段

  3. 回滚段

  1. 区由连续的页组成,大小固定为 1 MB。

  1. 页是 InnoDB 磁盘管理的最小单位,默认每个页大小为 16 KB,也可以通过配置设置修改。

  1. 数据是按行的形式存储的。

2.2 存储格式

Compact 行记录格式:

  1. 首部是一个非 NULL 变长字段长度列表,按照列的顺序逆序防止。

  2. NULL 标志位用来标志每个列是否是空值。

  3. 记录头信息。

  4. 事务 ID 列、回滚指针列。

  5. 主键列(如果没有显示定义主键)。

  6. 数据列。

2.3 行溢出数据

将一条记录中的默写数据存储在真正的数据页面外,InnoDB 会将大于指定字节大小的数据放在单独的 BLOB Page 中。

3 约束

关系型数据库可以保证存储数据的完整性,不需要应用程序的控制。

3.1 类型

  1. 定义特定数据类型约束

  2. 主键约束

  3. 唯一键约束

  4. 外键约束

  5. 触发器约束

4 分区

将一个表或所以分解为更小的可管理的部分,但是在访问数据库的时候,在逻辑上仍然是一个表,在物理上可能由多个分区组成。

Mysql 数据库支持水平分区,还不支持垂直分区。水平分区是指将同一表中的不同行的记录分配到不同的物理文件中,垂直分区是指将同一表中的不同列的记录分配到不同的物理文件中。

Mysql 的分区是局部分区索引,每个分区中存放了索引和数据。对于全局分区是指数据存放在不同的分区中,但是所有的索引放在一个对象中。

4.1 分区类型

  1. Range分区:基于一个给定连续区间的列值放入分区中。
  2. List分区: 离散值区间。
  3. HASH分区:根据用户定义的表达式的返回值进行分区。
  4. KEY分区:根据Mysql提供的哈希函数分区。
上次编辑于:
贡献者: blacklad