MySQL为什么选择了B+树

首先MySQL的数据**(索引+记录)**是存在磁盘里的,磁盘读取非常慢,所以要尽可能减少磁盘操作,因此我们需要更好的利用索引。
首先索引按顺序排列了数据,那么很显然最好的查找方式是二分查找,数组自然是一个初步的想法,但对于插入删除而言,数组开销太大,那么有什么好的方式能发挥二分查找的优势呢?
答案是二分查找树,左侧数据小于节点,右侧数据大于节点
在这里插入图片描述
但是有个极端情况,一直加入的是大于(或者小于)当前节点值得节点,那么二分查找树会退化成链表,就没法二分查找了
在这里插入图片描述
为解决这个问题,可以用平衡二叉查找树(AVL树),比二分查找树多了一个限制条件:每个节点得左右子树高度差不超过1。
在这里插入图片描述
红黑树也是平衡二叉树,但约束条件比较复杂,涉及左旋、右旋等。
不管是AVL树还是红黑树都是二叉树,就存在着一个问题——节点数量多的时候,深度很深,还是会增加磁盘io次数。
进一步,人们提出B树,也就是平衡M叉树,一层多放几个,比只放两个节点会好一些,降低树的深度。M是B树的阶,要求一个节点最多有M-1个值和M个子节点,多的话就分裂。
在这里插入图片描述
B树的数据和索引都存到节点中,也就是说找到了数据所在节点就能获取到数据了。但实际上,你每次从磁盘读入都是索引+记录,很大概率记录占用空间更大,那我一次读进内存,假设不是我要的,那我还不如一次多读点索引进来供我选择。而且B树还有一个问题,我想做范围查询假设要查5-8的数,那我就得做搜索,还得回退,又是一堆io,麻烦。


**重点:**因此B+树对B树做了升级,只有叶子节点存储了数据,其余节点只存索引,这样一次能读到更多索引。同时B+树的叶子节点之间也有链接,形成了链表,也就很好的支持了范围查询。
在这里插入图片描述
对比B树和B+树:

  • 单个查询:B树可能会快,因为可能不用到叶子节点就查到了,但是其波动很大,可能是叶子节点可能是非叶子节点。而B+树非叶子节点存放索引数量更多,比B树矮胖,更少io次数搜索到叶子节点。
  • 插入删除:B树可能会导致复杂的树结构变化;而B+树有很多冗余信息在非叶子节点上,基本不太会引起树的结构很大变化。
  • 范围查询:B树肯定是要树的遍历才行;B+树则因为叶子节点之间的链接,很好的支持了范围查询。
    Mysql的B+树做出了进一步改动,叶子节点是双向链表。对于聚簇索引,叶子节点的数据是具体的记录(实际数据);对于二级索引,叶子节点的数据是主键值。
    在这里插入图片描述

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

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

相关文章

Web 自动化神器 TestCafe(二)—元素定位篇

今天主要给大家介绍一下testcafe这个框架元素定位的方法。 一、CSS 选择器定位 使用 testcafe 对元素进行操作的时候,我们可以直接通过 CSS 选择器指定要操作的元素,比如,点击元素,input 输入文本内容,如下&#xff1…

C++中tuple数据结构使用

目录 1 基础知识2 模板3 工程化 1 基础知识 tuple是元组&#xff0c;一旦定义则不可修改&#xff0c;它可以存储一组不同类型的数据。它定义在头文件#include <tuple>中。 &#xff08;一&#xff09; tuple变量的定义。 tuple<int, float, string> a {1, 2.0,…

vue3 实现pdf预览

需要下载pdfjs-dist <template><a-modal class"fill-modal" v-model:open"state.visible" :title"state.modalTitle" width"50%" cancel"handleCancel"><div class"preview-btns-posi"><a-…

Ubuntu上安装Nginx

1、下载Nginx&#xff0c;下载地址 2、解压Nginx的压缩文件&#xff0c;tar -xvf nginx-1.24.0 3、进入文件内部&#xff0c; cd nginx-1.24.0 4、配置环境&#xff0c;./configure --prefix/usr/local/nginx --with-http_gzip_static_module&#xff0c;prefix为安装的路径。…

Web3 分布式存储 IPFS(Web3项目一实战之四)

IPFS是一种分布式文件存储协议,它允许世界各地的计算机存储和服务文件作为一个巨大的对等网络的一部分来存储和服务文件。 世界上任何地方的任何计算机都可以下载IPFS软件并开始托管和提供文件。 如果有人在自己的计算机上运行IPFS,并将文件上传到IPFS网络,那么世界上其他任…

OpenVPN Connect使用连接公网VPN服务器实现内网穿透

安装并运行OpenVPN Connect 点击AGREE 添加配置.OVPN文件 点击连接 连接成功 两个内网主机通过公网VPN穿透

Python subprocess设置超时不生效问题

使用Python脚本写了个测试程序&#xff0c;测试程序中会执行SHELL脚本&#xff0c;并且设置了超时时间&#xff0c;大概是这样的&#xff1a; subprocess.run("do something", shellTrue, stdoutsubprocess.PIPE, timeout30.0)但是却发现运行的时候&#xff0c;测试…

java学习part06数组

62-数组-数组的概述_哔哩哔哩_bilibili 这篇 Java 基础&#xff0c;我吹不动了 - 掘金 (juejin.cn) 1.数组概念 重点 2.数组声明和初始化 new的时候要么给出静态初始化的数据{a,b,c}&#xff0c;要么给出动态初始化指定长度 [4]。 否则报错&#xff0c;初始化必须确定长度…

java拼图小游戏

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 创建一个代码类 和一个运行类 代码如下&#xff1a; package heima;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import jav…

二维偏序问题

偏序 偏序(Partial Order)的概念: 设 A 是一个非空集,P 是 A 上的一个关系,若 P 满足下列条件: Ⅰ 对任意的 a ∈ A,(a, a) ∈ P;(自反性 reflexlve)Ⅱ 若 (a, b) ∈ P,且 (b, a) ∈ P,则 a = b;(反对称性,anti-symmentric)Ⅲ 若 (a, b) ∈ P,(b, c) ∈ P,则 (a,…

快速排序知识总结

快速排序思维导图&#xff1a; 快速排序算法模版&#xff1a; #include <iostream>using namespace std;const int N 1e5 10;int n; int q[N];void quick_sort(int q[], int l, int r) {if (l > r) return;int x q[(l r) / 2], i l - 1, j r 1;while (i < …

VS2022 配置 OpenCV并开始第一个程序

VS2022安装 首先下载 VisualStudioSetup.exe 下载连接&#xff1a;Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 点击上面的链接即可进入到下载页面。进入到下载页面&#xff0c;可看到有几个版本可选&#xff0c;如下&#xff1a; 我选择的是企业版&#xff1a;E…

c++并发编程/多线程 thread 库

系列文章目录 文章目录 系列文章目录-进程-前言base类线程执行函数结果分析小结&#xff0c;行为总结 -c11线程对象创建后既不join()也不detach()的后果-附注代码 -进程 进程是运行着的程序 进程内存空间分配&#xff1a;略 如果主进程结束而子进程未结束&#xff0c;则Linu…

YOLO目标检测——无人机航拍行人检测数据集下载分享【含对应voc、coc和yolo三种格式标签】

实际项目应用&#xff1a;智能交通管理、城市安防监控、公共安全救援等领域数据集说明&#xff1a;无人机航拍行人检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;…

流量主接入广告:实现盈利与用户体验的平衡

在互联网时代&#xff0c;网站和应用程序的盈利模式之一就是通过接入广告来获取流量变现。作为关键一环的流量主&#xff0c;如何巧妙地接入广告&#xff0c;既保证了盈利&#xff0c;又不损害用户体验&#xff0c;成为了一个备受关注的话题。 admaoyan猫眼聚合 广告形式的选择…

python运算符重载之构造函数和迭代器

1 python运算符重载之构造函数和迭代器 python运算符重载是在类方法中拦截内置操作-当类的实例使用内置操作时&#xff0c;pytho自动调用对应方法&#xff0c;并且返回操作结果。 NO#描述1拦截运算运算符重载拦截内置操作&#xff0c;比如打印、函数调用、点号运算、表达式运…

ubuntu20编译安装pkg-config

从下载到安装的步骤如下: wget https://pkg-config.freedesktop.org/releases/pkg-config-0.29.tar.gztar -zxvf pkg-config-0.29.tar.gzcd pkg-config-0.29/./configure --with-internal-glibsudo makesudo make checksudo make install make过程中可能会遇到的问题&#x…

2023年通信安全员ABC证证模拟考试题库及通信安全员ABC证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年通信安全员ABC证证模拟考试题库及通信安全员ABC证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;通信安全员ABC证证模拟考试题库是根据通信安全员ABC证最新版教材&#xff0c;通信安全员ABC证大纲整理…

DBS note3:B+ Trees

目录 1、介绍 2、B树特征 3、插入 4、删除 5、存储记录 1&#xff09;方法1&#xff1a;按值存储 2&#xff09;方法2&#xff1a;按引用存储 3&#xff09;方法3&#xff1a;按引用列表存储 6、聚类&#xff08;Clustering&#xff09; 1&#xff09;非聚类&#xff…

调整Windows键盘上只能看到拼音而无法看到实际的文本以及关闭输入法悬浮窗方法

一、输入法设置 如果您在键盘上只能看到拼音而无法看到实际的文本&#xff0c;这可能是因为您的输入法设置为中文拼音输入法或其他仅显示拼音的输入法。 要解决这个问题&#xff0c;您可以尝试以下方法&#xff1a; 1. 切换输入法&#xff1a;按下 Shift Alt 组合键或 Wind…