为什么MySQL选择使用B+树作为索引结构
B+树是MySQL最常见的索引结构,大部分存储引擎都支持 B+ 树索引。
相对于其他竞争力强的数据结构,B+树都有战胜它们成为大多时候MySQL选择使用索引结构的理由:
第一个强有力的竞争对手是B树:
1. B树每个节点都存储了完整的数据,而B+树只有叶子节点存储了完整的数据,非叶子节点只存储key和指针,这样B+树的非叶子节点可以存更多的键,从而减少树的高度,减少磁盘I/O次数。
2. 经典的B+树叶子节点会形成单链表,MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,使得这棵B+树的叶子节点形成了有序的双向链表。所以相比B树,B+树可以进行更高效的范围查询。
用100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88 120 268 250 分别构建B树和典型B+树、
B树:
B+树:
在进行范围查询时,B+ 树可以先通过索引快速定位到范围的起始值所在的叶子节点。由于叶子节点是通过双向链表相连的,后续可以沿着链表顺序遍历,依次获取满足范围条件的所有数据记录。
但是B树要进行范围查询频繁回溯到父节点查找下一个节点,会造成更多次的磁盘I/O。
3. 相对于B树,B+树拥有更稳定的查询性能。B+树的所有查询路径等长,每次查询都需要从根节点到叶子节点,路径长度相同,性能稳定(O(logN))。B树的数据可能分布在任意节点,某些查询可能在中间节点直接命中,查询性能不稳定。
另一个竞争者是二叉树(如红黑树) 相对于二叉树,树高较高(log₂N),存储海量数据时I/O次数远超B+树。这是因为B+树是多叉树,非叶子节点只存储key和指针,内存中能存放更多索引,容易命中缓存,使得磁盘I/O次数减少。
B+树从根节点到叶子节点的路径长度(即树高)直接决定磁盘I/O次数。
-
树高为3 → 最多3次磁盘I/O即可定位数据。
-
树高为4 → 最多4次磁盘I/O。
还有,B+树拥有高效的查找性能,它是多路平衡搜索结构,能减少磁盘 I/O 操作,还可像二分查找一样快速定位数据,数据存储具有冗余与可靠性的特点,能适应动态数据变化,在数据插入和删除时可通过结构调整保持平衡和有序。
而且B+树的节点大小通常设计成和磁盘页的大小一致,这样每次读取一个节点刚好是一个磁盘页,减少I/O次数。
我们反复提到了B+树可以减少磁盘I/O次数,为什么要那么在乎磁盘I/O次数呢?
磁盘I/O(Input/Output)是计算机从磁盘读取数据到内存(读I/O),或将内存数据写入磁盘(写I/O)的过程。
这是因为
-
磁盘访问速度远慢于内存:
-
内存访问速度:纳秒级(约100ns)。
-
磁盘访问速度(机械硬盘):毫秒级(约10ms),比内存慢10万倍!
-
-
减少磁盘I/O是MySQL性能优化的核心目标之一。
综上,B+树在磁盘I/O效率、范围查询性能、稳定性和存储利用率之间取得了最佳平衡,使其成为数据库索引的理想选择。
相关文章:
为什么MySQL选择使用B+树作为索引结构
B树是MySQL最常见的索引结构,大部分存储引擎都支持 B 树索引。 相对于其他竞争力强的数据结构,B树都有战胜它们成为大多时候MySQL选择使用索引结构的理由: 第一个强有力的竞争对手是B树: 1. B树每个节点都存储了完整的数据&…...
基于SSA-KELM-Adaboost(麻雀搜索优化的极限学习机自适应提升算法)的多输入单输出回归预测【MATLAB】
SSA-KELM-Adaboost 是一种结合了麻雀搜索算法(SSA)、核极限学习机(KELM)和Adaboost集成学习的复合回归预测模型。该模型通过参数优化与集成策略提升预测精度和鲁棒性,适用于复杂非线性回归问题。以下是其核心理论与…...
分享些常用的工具类
一、照片 1、Unsplash:https://unsplash.com/ 2、pixabay:https://pixabay.com/zh/ 二、壁纸 1、Wallpaper Engine 2、wallhaven:https://wallhaven.cc/ 3、极简壁纸:https://bz.zzzmh.cn/ 三、AI语音 1、微软Azure项目&…...
Apache SeaTunnel 构建实时数据同步管道(最新版)
文章作者 王海林 白鲸开源 数据集成引擎研发 Apache SeaTunnel Committer & PMC Member,Apache SkyWalking Committer,多年平台研发经验,目前专注于数据集成领域。 导读 在当今数字化快速发展的时代,数据已然成为企业决策…...
96.【C语言】解析预处理(4)
目录 5.条件编译 #ifdef 其他条件编译指令 #if 多个分支的条件编译 判断是否被定义 嵌套指令 6.头文件的包含方式 本地文件包含 库文件包含 嵌套文件包含 问题:头文件的重复包含 解决问题:避免头文件的重复包含 方法1:#pragma once 方法2:#ifndef、#define和#en…...
linux用户操作与权限
Linux的root用户 root用户(超级管理员) root用户拥有最大的系统操作权限。 普通用户的权限一般在其home目录内是不受限的,但是出来自己的home目录,仅有只读和执行权限。 su su命令切换到root账号 语法:su [-] [用户…...
Proof Beyond Boundaries: Hong Kong zkNight 活动精彩回顾
2 月 19 日,随着夜幕的降临,一场汇聚行业智慧与前瞻视野的高端主题活动 ——Proof Beyond Boundaries: Hong Kong zkNight,在香港铜锣湾 Vpoint 的 6/F 盛大启幕。本次活动由 ZEROBASE 主办,Techub News 承办,吸引了众…...
QT零基础学习之路(五)--自定义信号和槽
源码地址(优先更新):点击此处...
Pytorch实现之GIEGAN(生成器信息增强GAN)训练自己的数据集
简介 简介:在训练数据样本之前首先利用VAE来推断潜在空间中不同类的分布,用于后续的训练,并使用它来初始化GAN。与ACGAN和BAGAN不同的是,提出的GIEGAN有一个分类器结构,这个分类器主要判断生成的图像或者样本图像属于哪个类,而鉴别器仅判断图像是来自于生成器还是真实样…...
HTTP 动态报错码的原因和解决方法
目录 1xx(信息性状态码) 2xx(成功状态码) 3xx(重定向状态码) 4xx(客户端错误状态码) 5xx(服务器错误状态码) 参考文章 以下是 HTTP 动态报错码的常见原…...
单核处理器编程会简单很多的原因
乱序执行的本质:单核处理器的乱序执行(Out-of-Order Execution)允许指令动态调度以提升效率,但其核心原则是保持程序语义的单线程正确性。所有指令的最终提交(Retirement)必须严格按照程序顺序完成,以确保异常处理、中断和外部观察结果的正确性。 提交阶段的顺序性:尽管…...
C++之vector和list辨析
std::vector 和 std::list 是 C 标准库中两种常用的容器,它们都用于存储和管理元素集合,但在底层实现和性能特性上有显著的区别。 1. 底层实现 std::vector: 基于动态数组实现。元素在内存中是连续存储的。支持随机访问(通过下标访问元素&a…...
C++ 八股(整理记录)
1. 指针和引用的区别 定义与初始化: 指针:可以声明时不初始化,并且可以在之后指向任何同类型的变量。指针是一个变量,它存储的是另一个变量的地址。 int a 10; int* p; // 声明一个指向int的指针 p &a; // 将p指向变量a的…...
docker部署GPU环境
使用 Docker 部署 GPU 环境涉及到几个关键步骤,以下是详细步骤: 1. 安装 NVIDIA 驱动程序 确保你的系统已经安装了 NVIDIA GPU 驱动。这是使用 GPU 的前提条件。 2. 安装 Docker 和 nvidia-container-toolkit 首先,确保你已经安装了 Docker。然后,安装 NVIDIA Containe…...
单片机裸机编程-时机管理
对于 RTOS 实时操作系统,我们是通过 TASK(任务)进行底层操作的,这与裸机编程中的函数(fun)类似。不同的任务或函数实现不同的功能,在RTOS中,单片机有信号量、队列等不同任务之间的通…...
使用VScode开发STM32:基于CMake(包含标准库和HAL库工程)
使用VScode开发STM32:基于CMake(包含标准库和HAL库工程) 本教程使用VScode作为代码编辑工具、Cmake作为构建系统生成器、Make进行构建系统、使用arm-none-eabi-gcc进行交叉编译、使用OpenOCD作为代码下载与调试工具,最终搭建出适…...
Linux操作与权限2
查看权限控制信息 序号1,表示文件,文件夹权限控制信息 序号2,表示文件,文件夹所属用户 序号3,表示文件,文件夹所属用户组 12345678910d/l/-r/-w/-x/-r/-w/-x/-r/-w/-x/- 权限细节总共分为10个槽位 表格1&…...
解析第十一页
多选707、如图所示组网,SWA、SWB、SWC、SWD运行RSTP,则以下说法正确的是? A、可以在SWB的GE0/0/2端口开启边缘端口,让连接终端的接口快速进入转发状态 B、边缘端口收到BPDU之后会重新参与生成树的计算 C、可以在SWC的GEO/0/2端口开启边缘端口,让连接终端的接口快速进入转…...
SQL之order by盲注
目录 一.order by盲注的原理 二.注入方式 a.布尔盲注 b.时间盲注 三.防御 一.order by盲注的原理 order by子句是用于按指定列排序查询结果,列名或列序号皆可。 order by 后面接的字段或者数字不一样,那么这个数据表的排序就会不同。 order by 盲…...
阻止浏览器的默认缩放机制
在移动端浏览器中,当用户点击输入框(如密码输入框)时,页面可能会自动放大以提高可读性。这种行为通常是由于浏览器的默认缩放机制引起的。要阻止这种自动放大行为,可以采取以下几种方法: 使用 viewport 元…...
python 引用父目录:层级的模块
from pathlib import Path import sys 获取 project 目录 project_dir Path(file).resolve().parent.parent 将 project 目录添加到 sys.path 中 sys.path.append(str(project_dir)) 导入 support 模块 import support support.print_func(“Runoob”)...
实用:查找Linux进程调度统计信息的三个方法
实用:查找Linux进程调度统计信息的三个方法 在现代操作系统中,理解进程调度行为对于优化性能和解决瓶颈问题至关重要。本文将详细介绍如何在Linux系统中获取进程从调度队列中调入(enqueue)和调出(dequeue)…...
以下是自定义针对 Vite + TypeScript 项目的完整路径别名配置流程:
以下是针对 Vite TypeScript 项目的完整路径别名配置流程: 1. 安装必要依赖 bash npm install -D types/node 2. 配置 vite.config.ts typescript // vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from pat…...
基于Matlab实现汽车远近光灯识别的详细步骤及代码示例
以下是一个基于Matlab实现汽车远近光灯识别的详细步骤及代码示例,主要通过图像处理技术来区分远光灯和近光灯。 整体思路 图像预处理:包括读取图像、灰度化、去噪等操作,以提高后续处理的准确性。边缘检测:找出图像中的边缘信息…...
Solidity 开发环境
Solidity 开发环境 Solidity编辑器:Solidity编辑器是⼀种专⻔⽤于编写和编辑Solidity代码的编辑器。常⽤的Solidity编辑器包括 Visual Studio Code、Atom和Sublime Text。以太坊开发环境:以太坊开发环境(Ethereum Development Environment&a…...
Ollama+Cherrystudio+beg-m3+Deepseek R1 32b部署本地私人知识库(2025年2月win11版)
之前综合网络各方面信息得到的配置表: 在信息爆炸的时代,数据安全和个性化需求愈发凸显。搭建本地私人知识库,不仅能确保数据的安全性,还能根据个人需求进行个性化定制,实现知识的高效管理和利用。随着技术的不断发展…...
vue3.0将后端返回的word文件流转换为pdf并导出+html2pdf.js将页面导出为pdf
实现思路 1.将Word文档转换为HTML:mammoth.js,它可以将.docx文件转换为HTML 2.将HTML转换为PDF:使用html2pdf.js将HTML转换为PDF 如果想要相同的效果,也可以把前端页面直接导出转换为pdf: 运用的插件:html2pdf.js 后端…...
【心得】缓存穿透与缓存击穿总是记混,一文从英语单词含义角度分析带你区分清楚!
一句话省流版:缓存穿透的英语为cache penetration,可以翻译为缓存渗透,“渗透”联想到网安的攻击渗透,故缓存穿透是绕过防护进行攻击; 缓存击穿的英语为"cache breakdown",可以翻译为缓存故障,“…...
day02
作业2 为 Activity 设置2种不同的启动模式并通过 adb 命令进行查看任务栈信息,并且打印生命周期方法执行日志 step1:生成第二个Activity和相应配置、 一个是singleTask模式,还一个是mainActivity的默认格式 step2:打印生命周期…...
JavaScript 简单类型与复杂类型-堆和栈
深入理解JavaScript中的简单类型(基本数据类型)与复杂类型(引用数据类型)如何在内存中存储对于编写高效、无误的代码至关重要。本文将探讨这两种类型的差异,以及它们在内存中的存储机制——栈(Stack&#x…...
五、AIGC大模型_04LLaMA-Factory基础知识与SFT实战
1、LLaMA-Factory 基本介绍 1.1 定义 LLaMA-Factory 是一个开源的大型语言模型(LLM)微调框架,旨在帮助开发者和研究人员轻松地对预训练语言模型进行定制化训练和优化 1.2 功能特点 支持多种预训练模型 LLaMA Factory 支持超过 100 种主流的…...
数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例
数字IC后端时钟树综合专题(OCC电路案例分享) 复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例 1、什么是OCC? 片上时钟控制器(On-chip Clock Controllers ,OCC),也称为扫描时钟控制器(Scan Clock Con…...
LeetCodehot 力扣热题100 全排列
这段代码的目的是计算给定整数数组的所有全排列(permutations),并返回一个包含所有排列的二维数组。 思路解析 在这段代码中,采用了 深度优先搜索(DFS) 和 回溯 的方法来生成所有的排列。 关键步骤…...
深度学习c++资源库:vector容器,蓝桥杯常用算法sort,unique(排序+去重)
vector容器 1.基本概念 <vector> 是 STL 中的一个容器类,不同于普通数组的静态空间,vector可以动态扩展。 动态扩展:并不是在原空间连接新空间,而是找到更大的内存空间,将原数据拷贝到新空间,释放…...
Postgresql-重置统计信息(reset statistics)
文章目录 理解 PostgreSQL 中的 pg_stat_resetpg_stat_reset 的作用与使用时机pg_stat_reset 所需权限PostgreSQL 重置统计信息的方法重置整个database重置特定表的统计重置特定function的统计重置Statistics Collector:重置 WAL(Write-Ahead Logging)统…...
【Uniapp-Vue3】导入uni-id用户体系
在uniapp官网的uniCloud中下载uni-id用户体系 或者直接进入加载,下载地址:uni-id-pages - DCloud 插件市场 进入以后下载插件,打开HbuilderX 选中项目,点击确定 点击跳过 点击合并 右键uniCloud文件夹下的database文件夹&#x…...
【前沿探索篇七】【DeepSeek自动驾驶:端到端决策网络】
第一章 自动驾驶的"感官革命":多模态神经交响乐团 1.1 传感器矩阵的量子纠缠 我们把8路摄像头+4D毫米波雷达+128线激光雷达的融合称为"传感器交响乐",其数据融合公式可以简化为: def sensor_fusion(cam, radar, lidar):# 像素级特征提取 (ResNet-152…...
Staruml软件的介绍安装uml类图的绘制流程
文章目录 1.uml和staruml之间的关系2.软件的安装3.配置脚本语言4.Staruml创建类图4.反向工程 1.uml和staruml之间的关系 这篇文章主要是介绍这个staruml软件的安装和相关的背景介绍: 我和uml初识于IDEA软件,学习java的你一定用过这个软件,当…...
神经网络发展简史:从感知机到通用智能的进化之路
引言 神经网络作为人工智能的核心技术,其发展历程堪称一场人类对生物大脑的致敬与超越。本文将用"模型进化"的视角,梳理神经网络发展的五大关键阶段,结合具象化比喻和经典案例,为读者呈现一幅清晰的AI算法发展图谱。 一…...
快节奏生活
在当今快节奏的商务环境中,效率成为了决定企业竞争力的关键因素之一。亿可达软件连接平台,以其独特的功能和优势,为职场人士带来了前所未有的便捷与高效,成为了众多用户心中的“宝藏”工具。 1、亿可达:自动化流程的搭…...
Windows 11【1001问】通过Rufus制作Win 11系统安装U盘
随着科技的发展,Windows 11 已经成为许多用户的首选操作系统。在之前的几篇文章中,我们详细探讨了 Windows 11 的概念、安装配置要求以及如何下载 Windows 11 镜像文件,并介绍了六种不同的安装方法。本篇博客将聚焦于使用 ISO 文件安装 Windo…...
spring中手写注解开发(创建对象篇)
说明: 在spring底层中并不是我写的如此,这篇只是我用我自己的方式实现了使用注解组件扫描并且 创建对象,方法并不是很难,可以看一看,欢迎大佬评论 第一步: 我们需要自己写一个注解,我用的是idea…...
DeepSeek进入开源周,分享几点关于开源的思考
最近DeepSeek进入开源周,又把差点被大众遗忘在角落的开源话题拉了出来。 作为一个开源作者,也分享几点关于开源的思考。 AI对开源的影响 开源项目遇到的最大困难 开源项目不应该商业化 你的开源项目是垃圾...
大模型训练中的数据不平衡问题及其解决策略
目录 大模型训练中的数据不平衡问题及其解决策略 一、数据不平衡问题的影响 二、处理数据不平衡问题的方法 1. 过采样(Oversampling) 2. 欠采样(Undersampling) 3. 代价敏感学习(Cost-Sensitive Learning…...
本地部署DeepSeek R1满血版大模型
一、前言 老周上一篇分享了《本地部署DeepSeek R1大模型》,本地受硬件条件限制,只跑了80亿参数量的模型。 1.5b模型基本可以在大部分个人电脑甚至手机中运行,如果你有 6G 显存以上,那么可以部署7b模型,如果有16G显存&…...
外发抄板SCH与PCB检查系列
外发抄板SCH与PCB检查系列 一、检查到手的文件二、PCB与原理图的对应检查1.为什么要查SCH与Pcbdoc的对应?2.查询方法 三、PCB与实物的信号对应检查 一、检查到手的文件 外发出去两块板子:控制板与功率板。 抄板机构返回的文件: 1.互相独立的…...
EX_25/2/25
编写一个如下场景: 有一个英雄Hero类,私有成员,攻击,防御,速度,生命值,以及所有的set get 方法 编写一个 武器 Weapon 类,拥有私有成员攻击力,以及set get 方法 编写一个…...
C# 打印Word文档 – 4种打印方法
Word文档是日常办公和学习中不可或缺的一部分。比如在商务往来中,经常需要打印 Word 文档用于撰写和传递正式的商务信函、合作协议、项目提案等。打印出来的文档便于双方签字盖章,具有法律效力和正式性。本文将提供以下4种通过C# 打印Word文档的方法&…...
ROS的action通信——实现阶乘运算(一)
在ROS中除了常见的话题(topic)通信、服务(server)通信等方式,还有action通信这一方式,由于可以实时反馈任务完成情况,该通信方式被广泛运用于机器人导航等任务中。本文将通过三个小节的分享,实现基于action通信的阶乘运…...
Mac 上安装多版本的 JDK 且实现 自由切换
1.可以通过查看以下目录中的内容,确认当前已经安装的 jdk 版本。 cd /Library/Java/JavaVirtualMachines2.命令行查看 jdk 的安装路径 /usr/libexec/java_home -V3.下载要安装的jdk版本,修改环境变量( cat ~/.bash_profile) # 定义JDK 8和JDK 17的安装路…...