MySQL为什么选择使用B+树作为索引结构?

news/2024/12/27 10:01:58/

1. 可以先分析B+树的优势

  1. 矮胖: 随着数据量的增长,B+树的高度增长不会太快,使得磁盘的I/O次数减少
  2. 自平衡性: B+树是一种自平衡的二叉树,在新增和删除节点会进行分裂合并操作,以保证树的平衡,删除效率更高。
  3. 范围查询能力强:B+树的叶子节点之间通过双向链表连接,范围查询能力强,查询效率高。

2.再分析别的数据结构的劣势(二叉树、红黑树、B树、Hash表)

二叉树:

  • 查询效率不稳定,二叉树可能退化成链表
  • 随着数据量的增加,树的高度增长过快,层级比较深,从而增加I/O次数使得效率低下

红黑树:

本质也是一个二叉树(自平衡二叉树),在大数据量的情况下,层级比较深,会导致树的高度较高,检索速度慢

B-Tree(多路平衡查找树)

非叶子节点会存储数据,每页存储的键值对变少,导致树的层次变深,,从而增加I/O次数,使得效率低下

Hash表

哈希表是键值对的集合,通过键(key)即可快速取出对应的值(value),因此哈希表可以快速检索数据(接近 O(1))。,但是为什么 MySQL 没有使用其作为索引的数据结构呢?

主要是因为 Hash 索引不支持顺序和范围查询。

举例:

假如我们要对表中的数据进行排序或者进行范围查询,那 Hash 索引可就不行了。并且,每次 IO 只能取一个。

试想一种情况:

SELECT * FROM tb1 WHERE id < 500;

在这种范围查询中,优势非常大,直接遍历比 500 小的叶子节点就够了。而 Hash 索引是根据 hash 算法来定位的,难不成还要把 1 - 499 的数据,每个都进行一次 hash 计算来定位吗?这就是 Hash 最大的缺点了。


http://www.ppmy.cn/news/1558499.html

相关文章

K8S--“ Failed to create pod sandbox: nameserver list is empty“

原因是因为宿主机的/etc/resolv.conf 文件 有残缺&#xff0c; 填写一半&#xff0c;这个问题 cat /etc/resolv.conf填写好后&#xff0c;重启pod或等待一下再查看即可

Chromium GN 目标指南 - view_example 表单示例 (八)

1. 引言 在前面的文章中&#xff0c;我们学习了如何创建计数器示例&#xff0c;了解了如何使用 Label 和 Button 控件进行交互以及更新 UI 状态。在本篇文章中&#xff0c;我们将创建一个更复杂的示例 —— 表单&#xff0c;以学习如何使用 Textfield、Combobox 和 Checkbox 等…

spring cloud gateway 3

**Spring Cloud Gateway 3** 是 Spring Cloud 生态系统中的一个重要组件&#xff0c;用于构建 API 网关&#xff0c;提供路由、监控、安全等关键功能。以下是关于 Spring Cloud Gateway 3 的详细介绍&#xff1a; ## 1. 什么是 Spring Cloud Gateway&#xff1f; **Spring Clou…

牛客网刷题 ——C语言初阶——BC114 小乐乐排电梯

1.牛客网 &#xff1a;BC114 小乐乐排电梯 题目描述&#xff1a; 小乐乐学校教学楼的电梯前排了很多人&#xff0c;他的前面有n个人在等电梯。电梯每次可以乘坐12人&#xff0c;每次上下需要的时间为4分钟&#xff08;上需要2分钟&#xff0c;下需要2分钟&#xff09;。请帮助…

(补)算法刷题Day26:BM63 跳台阶

题目链接 描述 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法&#xff08;先后次序不同算不同的结果&#xff09;。 数据范围&#xff1a;1≤n≤40 要求&#xff1a;时间复杂度&#xff1a;O(n) &#xff0c;空间复杂度…

【LeetCode】9、回文数

【LeetCode】9、回文数 文章目录 一、数学: 除法和取模1.1 数学: 除法和取模 二、多语言解法 一、数学: 除法和取模 1.1 数学: 除法和取模 例如 15251, offset 也是五位数的 10000 先判断首1和尾1, 再变为 525, offset 变为 100 再判断首5和尾5, 再变为 2, offset 变为 1 整个…

cursor 编程测试,记录写一个全栈完整的crud的过程

一. 初始化工程&#xff08;手动&#xff09; 创建后端项目 intellij idea 创建 backend 项目。 创建前端项目 npm create vuelastest二. 用 Cursor 实现增删改查 Codebase 帮我实现一个基于sqlite的增删改查功能。 在本文件夹的根目录下&#xff1a; 前端工程文件夹是 fro…

《英雄联盟》提示缺少msvcp100.dll快速修复方法,找不到msvcp100.dll文件解决方法

一、msvcp100.dll缺失的深层原因 msvcp100.dll是Microsoft Visual C Redistributable Package中的一个关键组件&#xff0c;它提供了游戏和许多其他应用程序所需的C运行时库功能。当《英雄联盟》提示缺少msvcp100.dll时&#xff0c;通常意味着以下几种可能&#xff1a; Visual…