【mysql】数据结构之Hash、二叉树、红黑树

102 阅读2分钟
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 18 天,点击查看活动详情
【地震高岗,一派西山千古秀】
背景

mysql的数据结构是用b+tree来实现的。为什么不用其他数据结构呢?比如说hash、二叉树、红黑树、b-tree。

Hash

哈希表是键值对的集合,通过键(key)值即可快速的取出对应的值(value),因此hash表查询的速度很快。但是,哈希算法有hash冲突的问题,也就是说多个不同的key最后得到的index相同,虽然hash通过链表的方法解决了hash冲突,但是如果使用hash用来存储数据,mysql可能会将每一行数据都存储在hash表中,这样数据都会通过hash表来维护,如果数据库操作数据量特别庞大,添加数据的时候会增加hash冲突次数。这是原因之一。 还有一个原因是因为hash不支持顺序查找,假如我们要对表中的数据进行排序和范围搜索,hash实现起来会很麻烦。

二叉树

二叉树的每一个节点都只有两个子节点,当需要向其插入更多的数据的时候,就必须要增加树的高度,而增加树的高度会导致IO的次数变多,对于二叉树而言,它的查找操作的时间复杂度就是树的高度,树的高度越高查询性能会随着数据的增多越来越低。 二叉树节点中,右边的节点一定会大于左边的节点。如果是非正常的倾斜(比如id是自增的情况)的二叉树,查询一次数据就相当于与全表搜索。

红黑树

红黑树是一个二叉平衡树。平衡树在插入和删除的时候,会通过旋转操作将树的左右节点达到平衡。红黑树的特性导致从根节点到叶子节点的最长路径不会超过最短路径的2倍。在实际场景应用当中,MySQL表数据,一般情况下都是比较庞大、海量的。如果使用红黑树,树的高度会特别高,红黑树虽说查询效率很高。但是在海量数据的情况下,树的高度并不可控,而且红黑树也需要不断的调整平衡性,也需要消耗性能。如果我们要查询的数据,正好在树的叶子节点。那查询会非常慢。

【门朝大海,三河合水万年流】