• 常见问题:MySQL/B+树


    平衡二叉树

    此前讲红黑树时也提到了平衡二叉树,红黑树和AVL树都是能保证树不退化的平衡二叉树,平衡二叉树采用二分思想组织数据,能大大提高单点查找数据的效率,其组装过程略。

    作为对比,此处也列出平衡二叉树规则

    1. 节点最多有两个子节点。
    2. 节点大于其左子节点小于其右子节点。
    3. 树的左右两边层级最多相差不大于1。

    但平衡二叉树的性能和层级成反比,如果层级过多,则影响效率。因此数据库使用平衡二叉树组织数据过于低效,产生了B树。

    B树

    结构

    B树即多路平衡查找树,也叫多叉树,其规则如下:

    1. 递增排序,左小右大。
    2. 一个节点的子节点数在(1,m]且m>=2。
    3. 一个节点的关键字数量为[(m-1)/2,m)。
    4. 所有叶子节点在同层。

    查询

    由于B树采用左小右大的原则,可以快速定位数据所在的区间,能够快速定位到单点。

    插入

    1. 根据区间正常插入到叶子节点。
    2. 所在节点元素数超过m-1时,拆分,中间元素提到父节点,左边元素构成一个叶子节点,右边元素构成一个叶子节点。若引起父节点溢出,则递归拆分。

    删除

    1. 根据区间正常定位到关键字,删除。
    2. 所在节点元素数小于(m-1)/2,从子节点取点补缺,若子节点没有可取点,则从父节点取点补缺,若引起父节点元素数不足,递归此问题。

    除了有效减少数据的层数时,B树可以把块大小设置为4k,这样和磁盘块大小相同,可以快速将一个节点的数据全部取出,提高了性能。

    B+树

    相对于B树,B+树将所有元素都存储到叶子节点,非叶子节点保存的是叶子节点首条数据的引用,用于检索,因此B+树的叶子节点数=关键字数。此外,B+树的每个叶子节点,都包含着指向相邻叶子节点的指针。

    B+树的插入和B树几乎一致,只是拆分时不会将元素提到叶子节点,而是将元素的引用提到叶子节点(左节点包含m/2个元素),并递归拆分。

    删除时,若删除后节点元素不足,优先从兄弟节点借一个元素,并更新父节点的引用。若兄弟节点不能借出节点,则将两节点合并为同一节点,并更新父节点引用。引起父节点元素不足时,递归操作,当根节点只有一个子节点时则进行降级,引用下移并删除节点。

    B+树有以下好处:

    1. B+树非叶子节点仅存储引用,相对很小,一次性读入内存的关键字多(类似KV分离的好处)。
    2. B+树所有元素都在叶子节点,查询效率稳定。
    3. 叶子节点指向相邻兄弟节点,可以快速scan。

    B*树

    B树在B+树基础上,将非叶子节点也加上指向兄弟节点的指针,并定义非叶子节点关键字个数至少为(2/3)m,进而获取了更高的空间利用率。

  • 相关阅读:
    TCP三次握手四次挥手
    TCP与UDP的区别
    mysql从库设置全局只读,并创建普通账号
    docker安装mysql主从
    mysql 更换数据目录
    Docker 部署 ElasticSearch
    js获取地址栏传参
    PHP-MySQL基本操作
    基于element-tree-table树型表格点击节点请求数据展开树型表格
    拖拽读取文件
  • 原文地址:https://www.cnblogs.com/cielosun/p/11502909.html
Copyright © 2020-2023  润新知