数据库索引,必须满足查询快,且排序的特性
首先来看一下,常常用来索引的数据结构
1、Hash
Hash索引通过Hash算法建立hash表,任何的数据算出hash值后,都能够通过近似O(1)的效率查询到结果
Hash两种常见算法:
- 拉链法
- 开放地址法
但是因为hash是无序的,根本满足不了数据库排序以及范围查询
2、数组
数组不仅能够对数据进行排序,而且索引查询效率高,遍历全表也可以通过二分查询
但是为什么不能当作数据库索引呢,因为修改操作会导致大量的数据挪移,这应该都能理解
3、二叉树
有人又想到了二叉树,树不仅能够排序而且查询效率高
但是普通的树有个通病,容易出现左右子树不平衡,左右查询效率相差过大
4、红黑树
于是想到了面试常客红黑树,红黑树作为经典平衡树,不仅满足树的特性,而且解决了不平衡的特点
但是因为他是二叉树,数据一多,树的高度离谱,io读取(索引文件)消耗的时间就长,耽误效率
io读取和内存查询的速度相差太多
5、B树
平衡多路搜索树,每个索引节点都会携带数据
但Innodb默认规定页大小最大16KB,如果索引节点带上数据的话,可能一个节点容纳的索引会变少,导致B树高度变高,影响效率
6、B+树
B+树是一个平衡多路搜索树
不仅解决了平衡,而且多子树限制了树的高度,亿级的数据也就最多三层,io效率大大提高
B+ 树非叶子节点上是不存储数据的,仅存储键值,而 B 树节点中不仅存储键值,也会存储数据。之所以这么做是因为在数据库中页的大小是固定的,InnoDB 中页的默认大小是 16KB。如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的 IO 次数又会再次减少,数据查询的效率也会更快。
而且B树数据结点没有双向指针,对范围查找十分不友好