各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。
没有索引的查找
本集的主题是索引,在正式介绍索引之前,我们需要了解一下没有索引的时候是怎么查找记录的。为了方便大家理解,我们下边先只唠叨搜索条件为对某个列精确匹配的情况,所谓精确匹配,就是搜索条件中用等于=连接起的表达式,比如这样:
SELECT [列名列表] FROM 表名 WHERE 列名 = xxx;
在页中的查找
当表中的记录数量增多,无法全部存放在一个数据页中时,查找过程就变得更加复杂了。为了方便查找,我们通常会将数据按照主键值的大小范围划分到不同的数据页中,这样就可以通过主键值的范围快速定位到包含目标记录的数据页。但是,对于非主键列的查找,仍然需要遍历每个数据页中的单链表,这样的效率仍然是比较低的。
综上所述,没有索引的情况下,对于非主键列的查找效率是比较低的。因此,在实际的数据库应用中,我们通常会为表中的某些列建立索引,以提高查询效率。
对页中的记录进行增删改操作的过程中,我们必须通过一些诸如记录移动的操作来始终保证这个状态一直成立:下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值。这个过程我们也可以称为页分裂