不谈需求谈实现,都是耍流氓。
那么MySQL的需求是什么?
核心需求:精准查询,范围查询,排序
那么,哈希好像不大行,范围查询很慢。链表也不得行,要遍历。剩下的就是树了。广为人知的,二叉搜索树,AVL树,红黑树,B树等等。
二分查找,小的放左边,大的放右边。
局限性:
在二叉树的基础上做了平衡处理,虽然极大避免了退化问题,层数也固定了,但是最大的问题---层数过多的问题没有解决。
红黑树只是优化了插入、更新,弱化了平衡,在更新和搜索中取了折中。但是一样,层数过多的问题没有解决。
为了降低层数,最简单的,一层多放一点元素不就好了。
根据 Knuth 的定义,一个 m 阶的B树是一个有以下属性的树:
(晕了就过吧,理解就行)
总之就是让一个节点有多个关键字,再口语一点就是可以存多个数字。
这样,访问一个节点的时候, 就可以多拿出来一点了,也就是“页”。
缺点还是有的,访问下一页要怎么办?回到父节点到兄弟节点。于是,B+树来了。
很明显,将叶子节点用链表串联起来了, 还有就是子节点中包含了父节点的信息,比如22,这样的好处就是,可以直接访问到下一个,即,遍历了叶子节点就是遍历了全表。
B树还有一个问题就是页分裂。
当我们要插入550的时候,pageA满了,则分裂成两页,但是分裂后的A还有一个位置,就是“空洞”。
当然这个问题在如今这个磁盘不值钱的年代已经不是什么大问题了,实在不行还有重建表这种功能。