节点|曾经,我以为我很懂MySQL索引...( 二 )
其实最终选用 B+树是经历了漫长的演化:
- 二叉排序树 → 二叉平衡树 → B-Tree(B树) → B+Tree(B+树)
还有小伙伴提到的红黑树 , 是编程语言中的存储结构 , 不是 MySQL 的;如 Java 的 HashMap 就是用的链表加红黑树 。
好了 , 今天就带着大家一起看一下演化成 B+树的过程吧 。
【节点|曾经,我以为我很懂MySQL索引...】B+Tree 索引的前世今生
①二叉排序树
理解 B+树之前 , 简单说一下二叉排序树 , 对于一个节点 , 它的左子树的孩子节点值都要小于它本身 , 它的右子树的孩子节点值都要大于它本身 。
如果所有节点都满足这个条件 , 那么它就是二叉排序树 。 (此处可以串一下二分查找的知识点)
本文插图
上图是一颗二叉排序树 , 你可以尝试利用它的特点 , 体验查找 9 的过程:
- 9 比 10 小 , 去它的左子树(节点 3)查找 。
- 9 比 3 大 , 去节点 3 的右子树(节点 4)查找 。
- 9 比 4 大 , 去节点 4 的右子树(节点 9)查找 。
- 节点 9 与 9 相等 , 查找成功 。
②AVL 树(自平衡二叉查找树)
本文插图
上图是 AVL 树 , 节点个数和值均和二叉排序树一摸一样 。
再来看一下查找 9 的过程:
- 9 比 4 大 , 去它的右子树查找 。
- 9 比 10 小 , 去它的左子树查找 。
- 节点 9 与 9 相等 , 查找成功 。
你可以想象一下一棵 100 万节点的平衡二叉树 , 树高 20 。 一次查询可能需要访问 20 个数据块 。 在机械硬盘时代 , 从磁盘随机读一个数据块需要 10 ms 左右的寻址时间 。
也就是说 , 对于一个 100 万行的表 , 如果使用二叉树来存储 , 单独访问一个行可能需要 20 个 10 ms 的时间 , 这个查询可真够慢的!
③B 树(Balanced Tree)多路平衡查找树 , 多叉的
B 树是一种多路自平衡搜索树 , 它类似普通的二叉树 , 但是 B 树允许每个节点有更多的子节点 。
B 树示意图如下:
本文插图
B 树的特点如下:
- 所有键值分布在整个树中 。
- 任何关键字出现且只出现在一个节点中 。
- 搜索有可能在非叶子节点结束 。
- 在关键字全集内做一次查找 , 性能逼近二分查找算法 。
磁盘读取完需要的数据后 , 会按顺序再多读一部分数据到内存中 , 这样做的理论依据是计算机科学中注明的局部性原理:
- 由于磁盘顺序读取的效率很高(不需要寻址时间 , 只需很少的旋转时间) , 因此对于具有局部性的程序来说 , 预读可以提高 I/O 效率 。 预读的长度一般为页(page)的整倍数 。
- MySQL(默认使用 InnoDB 引擎) , 将记录按照页的方式进行管理 , 每页大小默认为 16K(可以修改) 。
推荐阅读
- 沙面|广州第一知名小岛,曾经领事馆林立,遍地都是洋建筑
- 情感|让男人爱你如初的妙招:“拾掇”
- |员工轮休,只发最低工资,曾经的赴美第一股,华晨汽车为何沦落至此?
- |这三座城市曾经是两广总督府驻地,一座名气很大,两座默默无闻
- 古村记|青海海西7处小众古址,在高原风光中寻找曾经记忆
- 威海|中韩文化艺术节点亮威海夜空!记者探秘“山东消费年”
- 情感解压台|爱你太累,想念太苦,我熬不住了
- Veyron|布加迪设计师最喜欢这6台威航,国内曾经有2台,每台都有故事
- 元稹|曾经沧海难为水?元稹:婚姻是场权力的游戏
- 明朝|明朝覆灭之前,左良玉手握80万大军,为何选择攻打曾经的自己人