索引的要求
- 索引和记录是保存在磁盘上的,当我们通过索引查找数据时,需要先从磁盘读取索引到内存中,然后通过索引去磁盘中找到某行数据,然后读入内存,所以这期间会涉及较多的磁盘IO,所以索引的第一个要求就是磁盘IO次数要尽可能少
- 我们查找数据的时候很多时候都不只查询一条记录,所以索引需要既能高效地查询某一个记录,也要能高效地执行范围查找
二叉搜索树 & 自平衡树 & B树 & B+树
- 二叉搜索树
二叉搜索树上每一个节点的左子树上节点的大小都比该节点小,右子树上节点大小都比该节点大。这样在非极端条件下,插入和查询的时间复杂度为O(LogN),但是有一个缺陷就是容易退化成链表,当数据是按照大小顺序插入的时候,插入的时间复杂度为O(N)
- 自平衡树
自平衡树改进了二叉搜索树容易退化成链表的毛病,有平衡二叉树和红黑树两种。平衡二叉树保证了左右子树高度差不超过1,红黑树也有一套红黑规则保证其自平衡。但是也有缺陷就是每个节点只有两个子节点,我们插入的数据较大的时候,二叉树的高度会很高,而我们在检索每一个节点的时候都会涉及一次磁盘IO,也就是会造成大量磁盘IO。
- B树
B树则改进了二叉树只有两个分支的问题,它是一个多叉树,每个节点可以有大于2个的节点,这样整个树的高度就得到了下降。但是它的缺陷是非叶子节点不仅存储了索引的信息还存储了记录的信息,这样就造成在查找某个节点或者记录的过程中需要更多的磁盘IO去从磁盘读取记录的数据到内存。而且,如果我们采用B树进行范围查询,肯定需要进行中序遍历,但是这也会涉及多个节点的磁盘IO问题。
- B+树
- B+树叶子节点才会存储记录数据,而非叶子节点只存储索引,这样比起B树非叶子节点可以存储更多的索引,从而使得整个B+树更加矮胖
- B+树比B树删除效率比较高,因为它存在大量的冗余节点,使得删除一个节点的时候可以直接从叶子结点删除,甚至可以不动非叶子节点。因此不会像B树那样会造成复杂的树的结构的变化(如下图,B+树删除6这个元素)
- B+树将所有叶子节点通过链表连接起来,有利于范围查询。B树进行范围查询需要通过中序遍历,而这样会涉及大量节点的磁盘IO