索引结构的演变过程:
B树:
索引最先是从B树结构演变过来的
看下面的数据结构就是BTree,早期的数据检索就是用的Btree
但是B树结构容易出现极端的不平衡状态,根据水桶原理···如果一棵树很倾斜,那么这个性能可能由最糟糕的节点决定。
如下图所示:
同样的检索where index=9,和where index= 65之间的差距是很大的。
这种情况如果我们需要检索9,就只需要检索一次就能搜索到,但是搜索65就需要6次了···那 千万级以上的数据检索的深度是不是很深呢?
B-树:
所以考虑到平衡我们就演变出来了B-Tree
所有的索引值都是1楼,从3楼遍历到1楼都需要比较3次,但是随着索引技术的发展,发现一个致命的缺点,那就是如果我需要执行的条件是 where index>=3 and index<=10这种情况,因为我们要遍历3,5,9,10根据图示,5和9之间没有通道,我们需要走6次才能走到,5和9之间没有直接走通,需要折返到中间节点然后才能扫描到9和10,如果我们把1楼的所有节点打通,是不是会快速很多呢 ?
于是后来演变出来了B+Tree。
B+Tree
一楼的所有区块都用一个Q指针连起来了,同样执行where index>=3 and index<=10就只需要4次就好了,在数量级比较大的情况下,这是相当有优势的。所以B+Tree也是常用的索引技术。但是B+Tree依旧是有缺陷的,他只有1楼是通的,如果第二层的节点需要遍历的话,还需要走到一楼去,所以就产生了B*Tree.
B*Tree
B*Tree和B+Tree之间在中间层加入了一个Q指针,所以说B*Tree才是最合理的索引。可以解决几乎所有的检索条件。但是现在大多数使用的还是B+Tree 因为几乎可以满足需求了。
索引结构的演变过程介绍完了,下个专题,我们来探讨索引的类型。