聚集索引与辅助索引

B+树由B树和索引顺序访问方法(ISAM)演化而来的。
精简的B+树的介绍
B+树是为磁盘或其他直接存取辅助设备设计的一种平衡查找树。在B+树中,所有记录节点都是按照键值的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行连接。

B+树 索引的本质就是B+树在数据库中的实现。
B+索引在数据库中有一个特点是高扇出性,因此在数据库中,B+树的盖度一般都在 2~4层,这也就是说查找某一键值的行记录时最多只需要 2到4次IO, 这倒不错。因为当前一般的机械硬盘每秒至少可以做100次IO,2~4 次的IO意味查询时间只需 0.02 ~ 0.04 秒。
数据库中的B+树索引可以分为聚集索引 (clustered index) 和辅助索引 (secondary index),内部都是B+树,即高度平衡。聚集索引与辅助索引不同的是,叶子节点存放的是否是一整行的信息


聚集索引

InnoDB存储引擎表是索引组织表,即表中数据按照主键顺序存放。而聚集索引(clustered index)就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页。聚集索引的这个特性决定了索引组织表中数据也是索引的一部分。同B+树数据结构一样,每个数据页都通过一个双向链表来进行链接。
由于实际的数据页只能按照一棵B+树进行排序,因此每张表只能拥有一个聚集索引。
由于定义了数据的逻辑顺序,聚集索引能够特别快地访问针对范围值的查询

许多数据库文档会告诉读者:聚集索引按照顺序物理地存储数据。
但是试想一下,如果聚集索引必须按照特定顺序存放物理记录,则维护成本显得非常之高。。所以聚集索引的存储并不是物理上连续的,而是逻辑上连续的。这其中有两点:一是前面说过的页通过双向链表链接,页按照主键的顺序存储;另一点是每个页中的记录也是通过双向链表进行维护的,物理存储上可以同样不按照主键存储。

聚集索引的另一好处是,它对于主键的排序查找和范围查找速度非常快。叶子节点的数据就是用户所要查询的数据。

如用户需要查询一张注册用户的表,查询最后注册的10位用户,由于B+树索引是双向链表的,用户可以快速找到最后一个数据页,并取出10条记录,若用命令EXPLAIN进行分析,可得:
聚集索引与辅助索引_第1张图片
可以看到虽然使用 ORDER BY 对记录进行排序,但是在实际过程中并没有进行所谓的 filesort 操作,而这就是因为聚集索引的特点。

另一个是范围查询(range query),即如果要查找主键某一范围内的数据,通过叶子节点上层中间节点就可以得到页的范围,之后直接读取数据页即可,又如:
聚集索引与辅助索引_第2张图片
执行 EXPLAIN 得到了 MySQL数据库的执行计划(execute plan),并且在rows列中给出了一个查询结果的预估返回行数。要注意的是,rows代表的是一个预估值,不是确切的值,如果实际执行这句SQL的查询,可以看到实际上只有9946行记录:
聚集索引与辅助索引_第3张图片

辅助索引

对于辅助索引(Secondary Index,也称为非聚集索引),叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,每个叶子节点中的索引行中还包含了一个书签(bookmark)。该书签用来告诉InnoDB存储引擎哪里可以找到与索引相对应的行数据。书签就是相应行数据的聚集索引键(主键)。
当通过辅助索引来寻找数据时,InnoDB存储引擎会遍历辅助索引并通过叶级别的指针获得指向主键索引的主键,然后再通过主键索引来找到一个完整的行记录。

你可能感兴趣的:(数据库)