在InnoDB存储引擎中,Row都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table),或者叫聚集索引(clustered index)
- 每张表必须有一个主键
- 根据主键的值构建一个B+树
- 这颗B+树的叶子节点存放所有记录
- 非叶子节点存放主键和指针(若干个{主键,指针}组成一个非页节点)
- 这里指针其实就是PageNumber,这个PageNumber就是下一层节点的PageNumber(这里不需要SpaceID,因为SpaceID对应的是ibd文件,我们现在是在ibd文件内部查找数据)
主键
如果创建表的时候没有显示指定主键,则InnoDB会按照如下方式选择或创建主键
- 判断表中是否有非空唯一索引,如果有,该列为主键
- 如果存在多个非空唯一索引,以创建表时第一个定义的非空唯一索引为准,而不是(columns)定义的顺序
- 如果上述条件都不符合,则InnoDB自动创建一个6字节大小的主键
索引组织表与堆表
- 堆表
堆表将索引和数据分开(如MyISAM),索引中叶子节点存放的是数据的位置,而不是数据本身
- 索引组织表
索引组织表将索引和数据放在了一起,索引的叶子节点(leaf page)存放了所有完整的记录(Row)。
索引即数据,数据即索引
注意:
1. 非叶子节点(Non-leaf page)中不会存放所有的数据(Row)的 {主键, PageNumber},而是从叶子节点(leaf page)中选出一个数据的主键,将这个主键和该页的PageNumber填入到非叶节点(Non-leaf page)中
2. 从逻辑上看,是一棵B+树,但是从物理上看都是每个页(非叶子节点和叶子节点)通过指针串在一起,使得逻辑有序。
标签:组织,主键,叶子,索引,PageNumber,18,存放,节点 From: https://www.cnblogs.com/gavin-zheng/p/18127784