MySQL学习-InnoDB中的索引(三)

75 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

前言

上篇我们学习了MySQL中的InnoDB的索引。有兴趣的小伙伴可以阅读(MySQL学习-InnoDB中的索引(二))。
下面我们继续学习MySQL中的InnoDB的索引。

InnoDB中的索引

上一节,学习了设计一个简单索引的设计方案,下面继续学习InnoDB中的索引。

迭代一次索引

首先将上一节方案中的目录项迭代一次,即把所有的目录项数据分配到一个新的数据页中存储。目录项记录和普通的数据表数据不同的地方如下:

  • 目录项记录的record_type值是1,而普通数据表的record_type值是0.
  • 目录项记录只有主键和页的编号两个列,而普通的数据表的列是我们自己定义的,可能包含很多列,另外还有InnoDB自己添加的隐藏列。
  • 记录头信息中还有一个叫min_rec_mask的属性,只有存储目录项记录的页中的主键值。
  • 最小的目录项记录的min_rec_mask的值为1,其他别的记录的min_rec_mask值都是0。

其中record_type值,我们在学习InnoDB的索引第一节时有说明:record_type是记录头信息的一项属性,表示记录的类型,0表示普通记录,2表示最小记录,3表示最大记录。这里有1,2,3,唯独没有1。通过上面的说明,我们知道1是给目录项记录使用的,和普通的用户数据记录区分开。

相同的地方:它们都是一样的数据页,都会为主键值生成页目录,从而在按照键值进行查找时可以使用二分法来加快查询速度。

使用迭代一次的设计方案,继续查找上一节的例子,查找主键为1的记录数据:

  1. 先到存储目录项记录的页,通过二分法快速定位到对应的目录项,通过目录项找到页码。
  2. 再到存储数据记录的页中根据二分法快速定位到主键值为1的用户记录数据。

今天先学习到这里,明天继续。