B+树索引(1)之为什么需要索引
前言
通过之前的文章我们知道InnoDB用于存储业务数据的页被称为数据页,而数据页的7大结构中的File Header结构中有上一页(FIL_PAGE_PREV)下一页(FIL_PAGE_NEXT)用来关联不连续的数据页,所以就可以形成如下所示的双向链表。
而每个数据页中的记录可以通过主键值从小到大通过记录头的next_record属性形成一个单链表,为了高效查询每个单链表又被分为若干组,每个组的最大主键值的偏移量就会组成一个页目录,通过主键查找某条记录就可以采用二分法快速定位到某个对应的槽,快速查找,结构图如下所示。
没有索引如何查找
查找单个数据页
以主键为条件查找
以主键为条件查找是最简单的查询方式,因为在单个数据页中记录就是按照主键从小到大的顺序进行排列的,我们可以很容易通过页目录然后二分查找定位到具体的槽,遍历整个组就可得到需要查找的记录。
以非主键为条件查找
因为数据页仅仅是根据主键的大小进行排序并且形成页目录,而非主键并没有类似页目录的结构,如果单个数据页中以非主键为条件查询那么只能从最小记录infimum开始遍历整个单链表对比记录的真实数据进行查询,效率低。
查找多个数据页
查询多个数据页显然比单个数据页更加麻烦,查找步骤分为两个
-
先需要定位到某个数据页。
-
再从某个数据页中定位到符合条件的记录。
不论是以主键条件查找还是以非主键条件查找想要定位到具体的数据页都是非常消耗时间的,所以这里需要一种高效的检索方法就是索引。