一、索引底层
InnoDB使用页来作为管理存储空间的基本单位,最大的连续存储空间限定为16KB。
索引底层的组成为实际的数据页。数据页中每条数据记录的组成包括:
- record_type:记录头信息的一项属性,表示记录的类型
-
- 0 表示数据记录、 1 表示目录项记录、 2 表示最小记录、 3 表示最大记录。
- next_record:记录头信息的一项属性,表示下一条地址相对于本条记录的地址偏移量。
- 各个列的值:记录实际的列数据。
- 其他信息 :除了上述3种信息以外的所有信息,包括其他隐藏列的值以及记录的额外信息。
二、第一层:目录项记录的页
- InnoDB对底层数据页进行管理的就是其上层的目录页。InnoDB采用目录项记录的形式来灵活管理所有的目录项。
- 每次查找数据,都将选定的页加载到内存当中,尽可能降低IO次数。
- InnoDB使用record_type来区分目录项记录和数据记录,然后还使用字段记录本页主键起始值和页号。注意,记录头信息中有一项 min_rec_mask 属性用于标记最小的主键值,值为1表示为最小主键值。
- 根据某个主键值去查找记录的步骤:
-
- 先从上级目录项记录页的Page Directory(页目录),通过二分法快速定位到目录项;
- 再到目录项记录的页,在其Page Directory(页目录)中,使用二分法快速定位到设定主键值的数据上。
- 注意:所有数据页都会为主键值生成Page Directory(页目录), 从而在按照主键值进行查找时,可以直接对页目录使用二分法来加快查询速度 。
三、第二层:多个目录项纪录的页
针对多次迭代的情况,可以创建目录项记录页的目录页,从而进一步进行管理。
实际效果图就如下图所示,该数据结构也就是B+树。
注意:使用的B+树一般不会超过4层,常用场景3层B+树已经足够存储数据。层数越多,IO次数越多,3层就需要3次IO。