你可能已经知道 B+ 树被用于 MySQL 的索引底层实现,那么,为什么是 B+ 树呢?本文由浅及深,带你探索数据库索引底层实现。
由一个例子总结索引的特点
加索引是数据库加速查询的一种方式,那么为什么用索引可以加快查询呢?
讲到索引,其实我们经常会听到一个图书馆的例子,图书馆里的书目繁杂,我们如何从若干本书里面找到一本我们想要的书呢?
我们根据图书馆系统检索,可以找到某本书对应的图书编号。
在基于书籍按照一定规则排列的前提下,我们可以根据图书编号找到这本书。
例如,假设图书编号根据:
第几个书架 - 书架上第几个格子 - 从左到右数第几个位置
这样的规则编排,
我们就可以轻松的获取到我们想要的书籍。
你也许发现了,这个例子中,藏着两个信息:
1:按照一定的规则排列:
2:有序
按照一定的规则,建立一定的映射关系,这让你联想到了什么?
没错,就是哈希表。
基于哈希表实现的哈希索引
在 Mysql 的 InnoDB 引擎中,自适应哈希索引就是用哈希表实现的。
哈希索引是数据库自身创建并使用的,DBA 本身不能对其进行干预,但是可以通过参数来禁止或者启用此特性。
显然用哈希表实现索引的好处是非常明显的,查找单个指定数据只需要 O(1)O(1) 的时间复杂度。
例如下面的 sql 语句:
select id from tablename where id == 1;
但是对于这种查找指定范围的 sql 语句,哈希索引就无能为力了。
select id from tablename where id BETWEEN 20 AND 23;
说明:因为哈希表本身是无序的,所以不利于范围查询
再次思考
到这里我们遇到了一个问题,就是哈希表虽然从查找效率上满足了我们查找单个数据的要求,