美文网首页
MySQL索引详解(四)BTree为什么更适合做索引结构

MySQL索引详解(四)BTree为什么更适合做索引结构

作者: chanyi | 来源:发表于2020-03-24 19:41 被阅读0次

    根据文章MySQL索引详解(三)索引的底层原理,了解了MySQL的索引实现原理,那么为什么在众多的数据结构中,索引的实现选中了BTree(实际实现是B+Tree,此文中不做详细区分),而不是二叉树,AVL树,红黑树等其他的数据结构呢?
    文章将根据以下的目录结构进行讲解


    文章目录结构
    1、BTree与其他数据结构的比较
    2、BTree做索引结构的根本原因


    1、BTree与其他数据结构的比较

    二叉树
    先从最简单的树二叉树说起。二叉树的要求是左子树的键值小于根的键值小于右子树的键值。
    结构如下图:

    二叉树
    二叉树的问题是,如果插入顺序是有序的,那么树形结构有可能会变得很深,甚至退化成一个链表结构,这样查找的效率会变的非常低。如下图:
    退化的二叉树
    AVL树
    AVL树是(Adelson-Velskii和Landis树)自平衡二叉查找树,AVL树的要求是任何两个子树的高度差不超过1。结构如下图:
    AVL数结构图
    这样的要求就不会出现上面二叉树退化为链表的结构。但是AVL树每次插入的时候都需要通过各种旋转操作,使自身变的平衡(左右子树高度差不大于1)。这样的树形结构虽然 查询速度比较,但是插入的过程相对较慢。
    广泛的使用与windos NT内核中
    红黑树
    AVL数是一种严格的平衡二叉树,每次插入或删除操作都需要严格的检测然后进行调整结构。严重的影响了插入删除的性能。而红黑树为了优化插入和删除的性能,不严格要求平衡,属于一种弱平衡二叉树。红黑树要求:没有一条路径比其他路径长超过2倍。
    红黑树结构图
    BTree
    为了考虑存储的问题,如果一个节点只能拥有两个子节点,那么存储的数据量是远远不够的。所以设计出可以拥更多子节点的BTree。

    2、BTree做索引结构的根本原因

    因为数据的存储在硬盘而不是内存,所有BTree的设计是为磁盘和其他外部存储所设计。


    BTree结构

    定义使用硬盘上的一个磁盘块来存储一个BTree数的节点。但是如果把data存放到每个节点中,这样会占据磁盘块空间,为了让固定大小的磁盘块上可以存放更多的键值,对BTree进行了一下优化,得到了B+Tree。结构如下:


    B+Tree结构
    与BTree不同的地方在于,将每个非叶子节点中的data去掉,并且给叶子节点增加一个双向的指针。这样做的好处是,每个节点中可以存放更多的索引键,减小树的深度,提升查找速度。
    增加叶子节点的双向指针,用于节点的遍历。

    3、使用B树和B+树构建索引各自的好处

    使用B树的好处
    B树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地方将会大大提高热点数据的查询效率。这种特性使得B树在特定数据重复多次查询的场景中更加高效。
    使用B+树的好处
    由于B+树的内部节点只存放键,不存放值,因此,一次读取,可以在内存页中获取更多的键,有利于更快地缩小查找范围。B+树的叶节点由一条链相连,因此,当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点,然后通过链进行O(N)的顺序遍历即可。而B树则需要对树的每一层进行遍历,这会需要更多的内存置换次数,因此也就需要花费更多的时间



    参考资料
    1、https://www.cnblogs.com/vianzhang/p/7922426.html

    相关文章

      网友评论

          本文标题:MySQL索引详解(四)BTree为什么更适合做索引结构

          本文链接:https://www.haomeiwen.com/subject/ndyayhtx.html