• mysql 索引底层


    【面试现场】为什么MySQL数据库要用B+树存储索引?https://www.sohu.com/a/280609547_818692

    hash索引o(1)   B+树索引 o(logn)

    为什么红黑树出现了,因为防止某些情况下二叉排序树退化为链表——诞生了二叉排序平衡树——树的性能取决于树的高度

    为什么DB要用M路B树,为了再降低树的高度,减少db 磁盘io 次数,如果在内存中,红黑树效率更高

    为什么M不能无限大,因为会退化成有序数组,无法一次载入内存,B树则可以一次加载一个节点

    B+树在B树的基础上,(1)仅在叶子节点存放数据——B树高度更大;(2)同时叶子节点链表——避免跨层范围查找

    为什么不用hash索引:

    (1)select范围

      (2) 不能排序

    (3)索引一般是在磁盘上,数据量大的情况可能无法一次装入内存,分批的话比B+树io次数多的多,B+树的设计可以允许数据分批加载,同时树的高度较低,磁盘io次数少,提高查找效率

      (4)hash冲突退化为遍历

    还有一篇文章,

    面试官:为什么MySQL的索引要使用B+树,而不是其它树?比如B树?

    https://www.cnblogs.com/sujing/p/11110292.html

    1、B-Tree因为非叶子结点也保存具体数据,所以在查找某个关键字的时候找到即可返回。而B+Tree所有的数据都在叶子结点,每次查找都得到叶子结点。所以在同样高度的B-Tree和B+Tree中,B-Tree查找某个关键字的效率更高
      2、由于B+Tree所有的数据都在叶子结点,并且结点之间有指针连接,在找大于某个关键字或者小于某个关键字的数据的时候,B+Tree只需要找到该关键字然后沿着链表遍历就可以了,而B-Tree还需要遍历该关键字结点的根结点去搜索
      3、由于B-Tree的每个结点(这里的结点可以理解为一个数据页)都存储主键+实际数据,而B+Tree非叶子结点只存储关键字信息,而每个页的大小有限是有限的,所以同一页能存储的B-Tree的数据会比B+Tree存储的更少。这样同样总量的数据,B-Tree的深度会更大,增大查询时的磁盘I/O次数,进而影响查询效率(针对聚簇索引主键索引)

  • 相关阅读:
    常见错误
    mac安装cocoapods
    WPS复制时删除超链接
    Network | 协议栈
    Leetcode | Remove Duplicates from Sorted Array I && II
    Leetcode | Search in Rotated Sorted Array I & II
    Leetcode | Jump Game I && II
    Leetcode | Combination Sum I && II
    Leetcode | Construct Binary Tree from Inorder and (Preorder or Postorder) Traversal
    Leetcode | Trapping Rain Water
  • 原文地址:https://www.cnblogs.com/silyvin/p/11408519.html
Copyright © 2020-2023  润新知