MySQL为什么使用B+树来作索引

我来详细解释一下B+树的结构和特点。

graph TDA[根节点 40|70] --> B[20|30]A --> C[50|60]A --> D[80|90]B --> E[10|15]B --> F[25|28]B --> G[35|38]C --> H[45|48]C --> I[55|58]C --> J[65|68]D --> K[75|78]D --> L[85|88]D --> M[95|98]%% 叶子节点之间的链接E --> |链表连接| FF --> |链表连接| GG --> |链表连接| HH --> |链表连接| II --> |链表连接| JJ --> |链表连接| KK --> |链表连接| LL --> |链表连接| M

在这里插入图片描述
在这里插入图片描述

B+树的核心特征:

  1. 结构特点
  • 所有数据都存储在叶子节点上
  • 非叶子节点只存储索引键值,不存储实际数据
  • 所有叶子节点通过指针相连,形成有序链表
  • 每个节点可以存储多个键值
  1. 查询操作优势
  • 等值查询:通过索引键快速定位到叶子节点
  • 范围查询:利用叶子节点间的链表结构,只需遍历相关叶子节点
  • 稳定的查询性能:因为所有数据都在叶子节点,查询路径长度相同
  1. 为什么适合做数据库索引
  • 减少磁盘I/O:非叶子节点只存储索引,可以容纳更多索引项,降低树的高度
  • 支持区间查询:叶子节点相连的特性使得范围查询非常高效
  • 利用磁盘预读特性:节点大小通常等于磁盘页大小,一次I/O可以读取完整节点
  1. 与B树的主要区别
  • 数据存储:B+树只在叶子节点存储数据,B树在所有节点都可能存储数据
  • 索引结构:B+树的非叶子节点只存储索引,更节省空间
  • 查询稳定性:B+树的查询路径长度始终相同,B树可能提前终止
  • 范围查询:B+树的叶子节点相连,范围查询更高效
  1. 维护特性
  • 自平衡:在插入和删除操作时自动维护平衡
  • 分裂合并:节点满时自动分裂,过少时自动合并
  • 索引冗余:非叶子节点的索引项在叶子节点中都会重复出现

实际应用案例:

  1. 当执行类似 SELECT * FROM users WHERE age BETWEEN 20 AND 30 的范围查询时,B+树可以:

    • 快速定位到age=20的位置
    • 通过叶子节点链表顺序扫描到age=30
    • 高效获取这个范围内的所有数据
  2. 当执行 SELECT * FROM users WHERE id = 100 的等值查询时:

    • 从根节点开始,通过索引键逐层向下查找
    • 最终在叶子节点定位到具体数据
    • 整个过程的I/O次数等于树的高度

这就是为什么MySQL选择B+树作为默认索引结构的原因:它在查询效率、范围搜索和磁盘I/O优化等方面都表现出色,特别适合数据库这种需要同时处理单点查询和范围查询的场景。

我来用可视化详细展示B+树的结构。

<svg viewBox="0 0 800 400" xmlns="http://www.w3.org/2000/svg"><!-- 根节点 --><rect x="350" y="20" width="100" height="40" fill="#FFB6C1" rx="5"/><text x="400" y="45" text-anchor="middle" fill="black">50</text><!-- 第二层节点 --><rect x="200" y="120" width="140" height="40" fill="#ADD8E6" rx="5"/><text x="270" y="145" text-anchor="middle" fill="black">20 | 35</text><rect x="460" y="120" width="140" height="40" fill="#ADD8E6" rx="5"/><text x="530" y="145" text-anchor="middle" fill="black">70 | 85</text><!-- 连接线 --><line x1="400" y1="60" x2="270" y2="120" stroke="black" stroke-width="2"/><line x1="400" y1="60" x2="530" y2="120" stroke="black" stroke-width="2"/><!-- 叶子节点 --><rect x="50" y="220" width="120" height="40" fill="#98FB98" rx="5"/><text x="110" y="245" text-anchor="middle" fill="black">10 | 15</text><rect x="190" y="220" width="120" height="40" fill="#98FB98" rx="5"/><text x="250" y="245" text-anchor="middle" fill="black">20 | 30</text><rect x="330" y="220" width="120" height="40" fill="#98FB98" rx="5"/><text x="390" y="245" text-anchor="middle" fill="black">35 | 45</text><rect x="470" y="220" width="120" height="40" fill="#98FB98" rx="5"/><text x="530" y="245" text-anchor="middle" fill="black">70 | 75</text><rect x="610" y="220" width="120" height="40" fill="#98FB98" rx="5"/><text x="670" y="245" text-anchor="middle" fill="black">85 | 90</text><!-- 连接线到叶子节点 --><line x1="270" y1="160" x2="110" y2="220" stroke="black" stroke-width="2"/><line x1="270" y1="160" x2="250" y2="220" stroke="black" stroke-width="2"/><line x1="270" y1="160" x2="390" y2="220" stroke="black" stroke-width="2"/><line x1="530" y1="160" x2="530" y2="220" stroke="black" stroke-width="2"/><line x1="530" y1="160" x2="670" y2="220" stroke="black" stroke-width="2"/><!-- 叶子节点之间的链表连接 --><path d="M170 240 L190 240" stroke="blue" stroke-width="2" marker-end="url(#arrow)"/><path d="M310 240 L330 240" stroke="blue" stroke-width="2" marker-end="url(#arrow)"/><path d="M450 240 L470 240" stroke="blue" stroke-width="2" marker-end="url(#arrow)"/><path d="M590 240 L610 240" stroke="blue" stroke-width="2" marker-end="url(#arrow)"/><!-- 箭头定义 --><defs><marker id="arrow" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L0,6 L9,3 z" fill="blue"/></marker></defs><!-- 图例 --><rect x="50" y="320" width="20" height="20" fill="#FFB6C1"/><text x="80" y="335" fill="black">根节点</text><rect x="150" y="320" width="20" height="20" fill="#ADD8E6"/><text x="180" y="335" fill="black">索引节点</text><rect x="250" y="320" width="20" height="20" fill="#98FB98"/><text x="280" y="335" fill="black">叶子节点(数据节点)</text><line x1="350" y1="330" x2="400" y2="330" stroke="blue" stroke-width="2" marker-end="url(#arrow)"/><text x="430" y="335" fill="black">叶子节点链表</text>
</svg>让我解释这个B+树的关键特征:1. 层级结构:
- 顶层粉色节点是根节点
- 中间蓝色节点是索引节点
- 底层绿色节点是叶子节点,存储实际数据2. 节点特点:
- 每个非叶子节点可以包含多个键值
- 键值用于指引查找方向
- 叶子节点存储实际数据记录3. 特殊设计:
- 所有叶子节点通过蓝色箭头连接,形成有序链表
- 这种设计特别有利于范围查询
- 非叶子节点只存储索引信息,不存储实际数据4. 数据查找示例:
- 要查找值为75的记录:1. 从根节点50开始2. 75>50,所以往右走到70|853. 70<75<85,定位到对应叶子节点70|755. 范围查询示例:
- 要查找20到45之间的所有记录:1. 先找到20所在的叶子节点2. 通过蓝色箭头顺序遍历到453. 期间经过的所有节点就是要查询的范围这种结构设计使得B+树特别适合数据库索引:
- 层级结构减少磁盘I/O次数
- 叶子节点链表支持高效的范围查询
- 所有数据都在叶子节点,查询路径稳定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/62704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 下载 b站视频 和音频

video_bvid&#xff1a; import os import requests import json import re from bs4 import BeautifulSoup import subprocess # from detail_video import video_bvid# video_bvid 是一个从外部得到的单个视频ID video_bvid BV1cx421Q7veclass BilibiliVideoAudio:def __in…

2024年06月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析

青少年软件编程(python)等级考试试卷(五级) 一、单选题(共25题,共50分) range()函数的基本用法是什么?( ) A. 生成一个等差数列 B. 生成一个随机数列 C. 生成一个递增数列 D. 生成一个递减数列 正确答案:A 答案解析:range() 函数用于生成一个等差数列,其中起始值、…

以太网链路详情

文章目录 1、交换机1、常见的概念1、冲突域2、广播域3、以太网卡1、以太网卡帧 4、mac地址1、mac地址表示2、mac地址分类3、mac地址转换为二进制 2、交换机的工作原理1、mac地址表2、交换机三种数据帧处理行为3、为什么会泛洪4、转发5、丢弃 3、mac表怎么获得4、同网段数据通信…

Shell编程 脚本的运行方式与注释

目录 shell脚本的运行方式 1. 路径运行 2.bash或sh加脚本运行 ​编辑 3.source在加脚本路径运行 shell脚本注释 单行注释 多行注释 shell脚本的运行方式 我们在/usr/etc/demo01目录下新建了一个脚本 a.sh &#xff0c;脚本内容是要求输出数字1&#xff0c;怎么运行呢 1…

获取淘宝商品评论数据的API应用:市场调研|产品更新|用户数据

下面是一段我用item_review&#xff08;获取商品评论数据&#xff09;抓来的商品评论数据&#xff1a; "items": {"total_results": 375,"totalpage": 38,"page_size": 10,"page": "1","item": [{&quo…

智算网络中Scale-out和Scale-up网络的技术原理

智算网络中Scale-out网络和Scale-up网络的本质区别是什么&#xff1f; 一、什么是智算中心的Scale-out网络和Scale-up网络 数据中心网络总体上可分为两大类&#xff1a;通算网络和智算网络。通算网络主要用于支持传统的计算任务和应用&#xff0c;如企业的IT系统、网站托管、电…

HCIA笔记7--OSPF协议入门

文章目录 0. 路由分类1. OSPF介绍1.1 概念1.2 报文类型 2. 邻接关系的建立2.1 邻居关系的建立2.2 邻接关系的形成2.3 ospf状态机 3. DR与BDR3.1 为什么要有DR和BDR&#xff1f;3.2 DR和BDR的选举原则 4. ospf的配置4.1 内部优先级 5. 问题5.1 三层环路如何解决&#xff1f; Ref…

C05S06-Nginx的内置变量和代理

一、常见内置变量 内置变量说明$uri请求的URL&#xff0c;不包括主机和参数$request_uri请求的URL&#xff0c;包括主机和参数$host请求的主机名$http_user_agent客户端信息&#xff0c;浏览器和操作系统$remote_addr客户端IP地址$remote_port客户端端口$server_addr服务端IP地…

mysql排序问题

mysql 建数据库时&#xff0c;需要指定 字符集 和 排序规则 建表时&#xff0c;也可以指定 也可以指定具体的字段 安照下面的sql顺序执行插入&#xff0c;它们的排序是什么样的&#xff1f; INSERT into test_sort (uid,create_time) VALUE (d,now()) INSERT into test_sort (u…

JAVA 图形界面编程 AWT篇(1)

前言 为了应对JAVA课设&#xff0c;小编走上了java的图形界面编程的道路&#xff0c;通过博客分享自己的学习历程&#xff0c;并进行笔记的记录。 AWT&#xff08;Abstract Window Toolkit&#xff09;介绍 AWT&#xff08;抽象窗口工具包&#xff09;是 Java 最早的图形用户界…

vulhub复现CVE-2021-44228log4j漏洞

目录 一&#xff1a;漏洞概述 二&#xff1a;漏洞原理 三&#xff1a;漏洞利用 lookup功能&#xff1a; JNDI解析器&#xff1a; ldap服务&#xff1a; RMI&#xff1a; 四&#xff1a;漏洞复现 4.1靶场 4.2dnslog测试 4.3部署jndi-injection-exploit 4.4打开监听端口 4.5触发请…

ip地址获取失败啥意思?ip地址获取失败怎么回事

在日常的网络使用中&#xff0c;我们时常依赖于稳定的IP地址来确保数据的顺畅传输和设备的正常识别。然而&#xff0c;有时我们会遇到“IP地址获取失败”的困扰&#xff0c;这不仅阻碍了我们的网络访问&#xff0c;还可能带来一系列的网络连接问题。那么&#xff0c;IP地址获取…

如何在 Android 项目中实现跨库传值

背景介绍 在一个复杂的 Android 项目中&#xff0c;我们通常会有多个库&#xff08;lib&#xff09;&#xff0c;而主应用程序&#xff08;app&#xff09;依赖所有这些库。目前遇到的问题是&#xff0c;在这些库中&#xff0c;libAd 需要获取 libVip 的 VIP 等级状态&#xf…

非常规使用client-go踩坑记

0x01 背景 编程者总有想偷懒的倾向。至少我的初衷时&#xff0c;尽量复用现有的代码。但有时也会变得弄巧成拙。 这不&#xff0c;最近需要在一个Go服务里添加一个CRD的缓存等待。熟悉k8s的同学都知道&#xff0c;向 kube-apiserver 提交一个更新&#xff0c;到同一个进程中的…

OpenGL ES详解——多个纹理实现混叠显示

目录 一、获取图片纹理数据 二、着色器编写 1. 顶点着色器 2. 片元着色器 三、绑定和绘制纹理 1. 绑定纹理 2. 绘制纹理 四、源码下载 一、获取图片纹理数据 获取图片纹理数据代码如下&#xff1a; //获取图片1纹理数据 mTextureId loadTexture(mContext, R.mipmap.…

java引用相关(四大引用类型,软引用避免oom,弱引用表,虚引用和引用队列,可达性分析算法)

1. 什么是引用&#xff1f; 问题&#xff1a;什么是引用&#xff1f;Java中的引用是如何工作的&#xff1f; 答案&#xff1a; 引用 是对象的句柄&#xff0c;用于访问堆内存中的对象。在Java中&#xff0c;引用变量实际上存储的是对象的地址&#xff0c;而不是对象本身。通…

十一、容器化 vs 虚拟化-Docker

文章目录 前言一、Docker 介绍1. 简介2. 应用场景3. 特点4. Docker和虚拟机之间的区别5. 解决痛点1. 解决依赖兼容2. 解决操作系统环境差异3. 小结 二、Docker 架构三、工作流程五、Docker 核心组件及其工作机制1. Docker 客户端&#xff08;Docker Client&#xff09;2. Docke…

linux学习笔记01 基础命令

目录 创建 touch 创建文件 &#xff08;创建但是不打开&#xff09; vi / vim 创建文件 (创建一个文件并打开) mkdir 创建文件夹 切换目录 cd 查看 pwd 查看当前目录完整路径 ls 查看目录信息 dir 查看目录信息 ll 表示查看目标目录下的信息 ls -a 查看当前目录下的…

【深度学习】深刻理解多模态模型CLIP

CLIP&#xff08;Contrastive Language-Image Pretraining&#xff09; 是由 OpenAI 提出的一个多模态模型&#xff0c;旨在学习视觉和语言的联合表示&#xff0c;能够通过图像和文本之间的对比学习来实现图像和文本之间的紧密联系。CLIP 模型可以通过自然语言描述理解和处理图…

android 聊天界面键盘、表情切换丝滑

1、我们在聊天页面时候&#xff0c;往往会遇到&#xff0c;键盘、表情、其他选择切换时候页面会出现掉下来再弹起问题&#xff0c;这是因为&#xff0c;我们切换时候&#xff0c;键盘异步导致内容View高度变化&#xff0c;页面掉下来后&#xff0c;又被其他内容顶起这种很差视觉…