• 小林coding网站---mysql基础-MySQL索引的数据结构和算法


    MySQL索引的数据结构和算法

    索引问题相关

    image

    image

    image

    image
    引出的问题是索引覆盖与回表,在执行器的部分已经讲过。

    MySQL 默认的存储引擎 InnoDB 采用的是 B+ 作为索引的数据结构,原因有:

    B+Tree vs B-Tree

    • B+ 树的非叶子节点不存放实际的记录数据,仅存放索引,因此数据量相同的情况下,相比存储即存索引又存记录的 B 树,B+树的非叶子节点可以存放更多的索引,因此 B+ 树可以比 B 树更「矮胖」,查询底层节点的磁盘 I/O次数会更少。

    • B+ 树有大量的冗余节点(所有非叶子节点都是冗余索引),这些冗余索引让 B+ 树在插入、删除的效率都更高,比如删除根节点的时候,不会像 B 树那样会发生复杂的树的变化;

    • B+ 树叶子节点之间用链表连接了起来,有利于范围查询,而 B 树要实现范围查询,因此只能通过树的遍历来完成范围查询,这会涉及多个节点的磁盘 I/O 操作,范围查询效率不如 B+ 树。

    B+ tree vs 二叉树

    对于有N个叶子节点的B+Tree,其搜索复杂度为O(logdN),其中d表示节点语序的最大的子节点的个数为d个。在实际应用中,d值大于100,这样就保证了,即使数据达到1000W级别的时候,B+Tree的高度依然能够3-4层,也就是说一次数据查询只需要做3-4次的磁盘的IO操作就能查询到目标数据。
    对比二叉树,每个父级节点的儿子节点的个数为2,其搜索的复杂度为O(logN), 比B+Tree的层高高出不少,因此二叉树的检索的目标数据所经历的磁盘IO次数要多得多。

    B+Tree vs Hash

    Hash 在做等值查询的时候,速度非常快,其搜索复杂度为O(1)。但是Hash表不适合做范围查询,他更加适合做等值查询,B+Tree索引比Hash表索引有着更为广泛的用途。

    原文链接 (小林的网站)

  • 相关阅读:
    我为什么觉得程序员是个高危职业
    microcom串口调试工具使用
    java编译时的sourcepath选项
    Python之作业(二)
    【试题039】 多个逻辑或例题
    GPT提示词分享 —— 小说家
    shell实践:添加删除组和向组中添加删除成员
    水利水电工程资质怎么办理,水利水电工程施工总承包三级资质办理条件有哪些
    红黑树以及JAVA实现
    【Python笔记-设计模式】组合模式
  • 原文地址:https://blog.csdn.net/onemorepoint/article/details/126346253