• mySQL索引数据数据结构 B+ 树


    一、B树

    1、B树的结构:

      B树是一种多路搜索树

    1. 定义任意非叶子结点最多只有M个儿子,且M>2。

    2. 根结点的儿子数为[2, M]。

    3. 除根结点以外的非叶子结点的儿子数为[M/2, M]。

    4. 每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)。

    5. 非叶子结点的关键字个数=指向儿子的指针个数-1。

    6. 非叶子结点的关键字:K[1], K[2], …, K[M-1],且K[i] <= K[i+1]。

    7. 非叶子结点的指针:P[1], P[2], …,P[M](其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树)。

    8. 所有叶子结点位于同一层。

      下图是一个M=4阶的B树。

    2、B树的搜索过程:

      B树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的是叶子结点。

      查找文件29的过程:在每个节点,利用二分查找,找到对应的子节点

    1. 根据根结点指针找到文件目录的根磁盘块1,将其中的信息导入内存。(磁盘IO操作1次)

    2. 此时内存中有两个文件名17,35和三个存储其他磁盘页面地址的数据。根据算法我们发现17<29<35,因此我们找到指针p2。

    3. 根据p2指针,我们定位到磁盘块3,并将其中的信息导入内存。(磁盘IO操作2次)

    4. 此时内存中有两个文件名26,30和三个存储其他磁盘页面地址的数据。根据算法我们发现26<29<30,因此我们找到指针p2。

    5. 根据p2指针,我们定位到磁盘块8,并将其中的信息导入内存。(磁盘IO操作3次)

    6. 此时内存中有两个文件名28,29。根据算法我们查找到文件29,并定位了该文件内存的磁盘地址。

    3、B树的特性:

    1. 关键字分布在整颗树的所有节点

    2. 任何一个关键字出现且只出现在一个结点中。

    3. 搜索有可能在非叶子结点结束。

    4. 其搜索性能等价于在关键字全集内做一次二分查找。

    二、B+树

    1、B+树的结构

      一般在数据库系统或文件系统中使用的B+Tree结构都在经典B+Tree的基础上进行了优化,增加了顺序访问指针。

      B+树是B树的一种变形树,总结起来,数据库索引的B+树与B树的差异在于:

    1. 非叶子结点的子树指针与关键字个数相同。

    2. 非叶子结点的子树指针P[i],指向关键字值属于[K[i],K[i+1])的子树(注意,区间是前闭后开)。

    3. 为所有叶子结点增加一个链指针。

    4. 所有关键字都在叶子结点出现

    B+树的特性:

    1. 所有关键字都出现在叶子结点的链表中,且链表中的关键字是有序的。

    2. 搜索只在叶子结点命中

    3. 非叶子结点相当于是叶子结点的索引,叶子结点是存储关键字数据的数据层。

    总结:

      B+树是一种多路搜索树,多用作数据库底层的数据存储结构,用于快速查找对应关键字数据,是从B树的结构优化过来的,B+树的所有的关键字信息都存储在叶子节点上,非叶子节点只做索引使用。

    三、mysql索引数据结构:

    1、mySQL索引数据结构

      mysql索引的数据结构采用的是 B+Tree,MyISAM和InnoDB的索引均采用B+树数据结构。

      数据按页来保存,只保存在叶子节点上,叶子节点上也按照顺序添加了指针。非叶节点不存数据,只存指针。

      在mysql中的数据结构都是B+树的结构,可以充分利用数据块,来减少IO查询的次数,提升查询的效率,如图所示,一个数据块data里面,存储了很多个相邻key的value值,所有的非叶子节点都不存储数据,都是指针。
     
    Mysql采用B+树的优点:IO读取次数少(每次都是页读取),范围查找更快捷(相邻页之间有指针)

    2、B Tree的特点:

    • 所有键值分布在整个树中;(区别与B+树,B+树的值只分部在叶子节点上)
    • 任何关键字出现且只出现在一个节点中;(区别与B+树)
    • 搜索有可能在非叶子节点结束;(区别与B+树,因为值都在叶子节点上,只有搜到叶子节点才能拿到值)
    • 在关键字全集内做一次查找,性能逼近二分查找算法。

    3、B+树的结构特点:

    • B+树索引并不能找到一个给定键值的具体行,它找到的只是被查找数据行所在的页,接着数据库会把页读入到内存,再在内存中进行查找,最后得到要查找的数据。数据的读取是精确到页的,因为页是计算机管理存储器的逻辑块,IO的磁盘读取,每次都读取数据的大小是一个页大小的整数倍。
    • 假设B+Tree的高度为h,一次检索最多需要 h-1 次 I/O(根节点常驻内存),复杂度 O(h) = O(logmN),m 指的是一个节点存储的数据的个数。实际应用场景中,M 通常较大,常常超过 100,因此树的高度一般都比较小,通常不超过 3。

    4、 b-tree 和 和 b+tree 的区别:

    1) B-树的关键字、索引和记录是放在一起的,B+树的非叶子节点中只有关键字和指向下一个节点的索引,记录只放在叶子节点中。

    2) 在 B-树中,越靠近根节点的记录查找时间越快,只要找到关键字即可确定记录的存在;而 B+树中每个记录的查找时间基本是一样的,都需要从根节点走到叶子节点,而且在叶子节点中还要再比较关键字。

    5、B+树的元素插入和删除逻辑:

    https://blog.csdn.net/sunshine_lyn/article/details/82747596



     主键索引和辅助索引的区别:https://learnku.com/articles/26852

    参考博客:https://www.jianshu.com/p/d90f6b028d0e

    彻底搞懂MySQL的索引:

    https://mp.weixin.qq.com/s/OMgyqqi-r44KI-TjYKP59g

  • 相关阅读:
    搭建selenium+python自动化环境
    编写函数计算一个数字的长度
    编写函数digit(num, k),函数功能是:求整数num从右边开始的第k位数字的值,如果num位数不足k位则返回0。
    求m-n之间数字的和
    编写一个函数,生成4位数字的验证码
    编写一个函数,在页面上输出一个N行M列的表格,表格内容填充0~100的随机数字
    编写一个函数,计算三个数字的大小,按从小到大的顺序输出
    编写函数,判断一个字符串的内容是不是纯数字
    编写函数,求圆的面积
    编写一个函数,计算两个数字的和差积商
  • 原文地址:https://www.cnblogs.com/guoyu1/p/12236619.html
Copyright © 2020-2023  润新知