索引的价值是为了更快找到想要的数据,就像书的目录一样.
索引常见模型
哈希表[k-v]
因为新增数据是无序的,所以新增速度较快,但是查询的效率就没那么高了.
比较适用于等值查询,所以一些nosql数据库会采用该类模型.
有序数组
等值查询和范围查询都比较高效,但是更新数据的成本比较高,往中间插一条记录需要挪动后面所有的记录.
有序数组索引只适用于静态存储引擎
二叉搜索树
二叉搜索树的特点是:父节点左子树所有结点的值小于父节点的值,右子树所有结点的值大于父节点的值。
树可以有二叉,也可以有多叉。多叉树就是每个节点有多个儿子,儿子之间的大小保证从左到右递增。二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树。其原因是,索引不止存在内存中,还要写到磁盘上。
N叉树
为了让一个查询尽量少地读磁盘,就必须让查询过程访问尽量少的数据块。那么,我们就不应该使用二叉树,而是要使用“N 叉”树。这里,“N 叉”树中的“N”取决于数据块的大小。
N 叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了。
以 InnoDB 的一个整数字段索引为例,这个 N 差不多是 1200。这棵树高是 4 的时候,就可以存 1200 的 3 次方个值,这已经 17 亿了。考虑到树根的数据块总是在内存中的,一个 10 亿行的表上一个整数字段的索引,查找一个值最多只需要访问 3 次磁盘。其实,树的第二层也有很大概率在内存中,那么访问磁盘的平均次数就更少了。
这是我在极客时间2月的第14天学习,参考文章: | 深入浅出索引(上) (geekbang.org)