InnoDB是如何存储数据的
InnoDB是以数据页为单位来读写数据的,数据页大小默认是16KB,每次从磁盘最少读取16KB的数据到内存,或者刷新内存中16KB的数据到磁盘
- 文件头记录数据页的信息,包括两个指针,一个指向上一个数据页,一个指向下一个数据页
- UserRecord中存储了行记录,这些记录会通过单向链表按照主键的顺序有小到大排列
- 单向链表的检索效率比较低,所以数据页中还有一个页目录结构帮助快速查找记录。
- 数据页中的记录被分为若干组,当然,带有删除标识的不会参与分组;每组中的记录也是按照主键从小到大排序,每组中最后一条记录的主键值最大,它的头信息中记录了本组的记录条数(n_owned字段),页目录记录了每组最大最后一条记录的地址偏移量,叫做槽,它相当于指针指向了不同组的最后一条记录。
- 当我们检索数据页中的记录时,由于记录都是按照主键大小排列的,可以使用槽号进行二分法定位某个槽,也就是定位到某一组,然后比较该组的最大记录的主键值,最终定位到某个槽。由于槽都是定位到每组最大的那条记录,所以如果要定位到最小的那条记录,可以通过查找上一个槽的最后一条记录,然后沿着单向链表向后检索
- 为了减少在某个分组中检索的时间复杂度,InnoDB规定了每个分组的大小
- 第一个分组只能有一条记录
- 最后一个分组记录条数在1-8之间
- 其余分组记录条数在4-8之间
B+树是如何查询的?
InnoDB采用了B+树进行索引,B+树中的每一个节点都是一个数据页