索引的底层数据结构、B+树的结构、为什么InnoDB使用B+树而不是B树呢

索引的底层数据结构

MySQL中常用的是Hash索引和B+树索引

Hash索引:基于哈希表实现的,查找速度非常快,但是由于哈希表的特性,不支持范围查找和排序,在MySQL中支持的哈希索引是自适应的,不能手动创建

B+树的结构

        B+树 是一种高效的多路平衡树,适合磁盘存储和范围查询。它的结构特点包括数据集中在叶子节点、叶子节点连接成链表、内部节点仅存储键值和指针。在数据库和文件系统中,B+树 被广泛应用于索引和数据存储,具有查询性能稳定、适合高并发等优势。

 如图:B+树具有以下特点:

只有叶子结点才存放数据,中间节点都是用来存放目录项作为索引

非叶子节点分为不同层次,通过分层来降低每一层的搜索量

B+树的搜索策略:

从根节点开始,通过二分法快速定位到符合页内范围包含查询值的页,在中间结点中继续根据二分法来寻找符合页内范围复合查询值的页,接着在叶子节点中通过槽查找记录使用二分法快速定位要查询的记录在哪个槽,找到槽后再遍历槽中所有的记录,找到寻找的分组。

为什么InnoDB使用B+树而不是B树呢 

B-Tree:

  • 每个节点既存储数据也存储子节点的指针
  • 数据分布在所有的节点中,包括内部节点和叶子节点
  • 查找时可能会直接在内部节点中就能找到数据不需要遍历到叶子节点

B+Tree:

  • 只有叶子结点存储数据,内部节点仅存储键值和子节点的指针
  • 所有叶子节点通过指针连接成一个有序链表
  • 查找时必须遍历到叶子节点才能获取数据 

B+Tree的优势:

更适合磁盘I/O:

  • 因为B+树的内部节点不存储数据只存储键值和指针,所以每个节点可以存储更多的键值,从而降低树的高度,树的高度越低磁盘I/O次数越少,查询性能越高(索引数据量很大,一定是存储在磁盘中的,每访问一个节点就会进行一次磁盘IO操作,所以树的高度越低,一次查询的期望IO次数就越少,效率就越高)
  • B+树的叶子节点通过指针连接成链表,更适合范围查询如(BETWEEN,>,<等操作),而树的范围查询需要在不同层级的节点之间跳转,效率较低 

更适合数据库场景:

  • 数据集中在叶子节点上,查询时都需要遍历到叶子节点,这使得查询性能更稳定。B树的数据可能分布在内部节点和叶子结点,查询性能不稳定 
  • 数据库查询中经常需要使用范围查询,B+树的叶子节点链表结构非常适合这种场景,而B树需要多次遍历内部节点

更适合并发控制:

  • 在并发场景下,B+树的叶子节点链表可以更容易地支持范围查询和顺序访问
  • 而B树的结构在并发访问时可能需要更多的锁机制(数据分布在内部节点和叶子节点。节点分裂与合并涉及多个节点。锁的粒度较大,容易导致锁冲突)

B+树在InnoDB中的具体应用:

主键索引(聚簇索引):

        InnoDB使用B+树实现主键索引,叶子节点存储完整的数据行

        这种设计是的通过主键查询数据时可以直接获取数据,不需要回表

二级索引(非聚簇索引): 

        InnoDB的二级索引也是B+树,但是叶子节点存储的是主键值,通过二级索引查询时,先获取主键值再通过主键索引查找数据(回表)

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

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

相关文章

RK3568中使用QT opencv(显示基础图像)

文章目录 一、查看对应的开发环境是否有opencv的库二、QT使用opencv一、查看对应的开发环境是否有opencv的库 在开发板中的/usr/lib目录下查看是否有opencv的库: 这里使用的是正点原子的ubuntu虚拟机,在他的虚拟机里面已经安装好了opencv的库。 二、QT使用opencv 在QT pr…

29.Word:公司本财年的年度报告【13】

目录 NO1.2.3.4 NO5.6.7​ NO8.9.10​ NO1.2.3.4 另存为F12&#xff1a;考生文件夹&#xff1a;Word.docx选中绿色标记的标题文本→样式对话框→单击右键→点击样式对话框→单击右键→修改→所有脚本→颜色/字体/名称→边框&#xff1a;0.5磅、黑色、单线条&#xff1a;点…

省级-新质生产力数据(2010-2022年)-社科数据

省级-新质生产力数据&#xff08;2010-2022年&#xff09;-社科数据https://download.csdn.net/download/paofuluolijiang/90028612 https://download.csdn.net/download/paofuluolijiang/90028612 新质生产力是指在现代科技和经济社会发展的推动下&#xff0c;由新的生产要素…

【PyTorch】7.自动微分模块:开启神经网络 “进化之门” 的魔法钥匙

目录 1. 梯度基本计算 2. 控制梯度计算 3. 梯度计算注意 4. 小节 个人主页&#xff1a;Icomi 专栏地址&#xff1a;PyTorch入门 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活…

【数据分析】案例04:豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask)

豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask) 豆瓣电影Top250官网:https://movie.douban.com/top250写在前面 实验目的:实现豆瓣电影Top250详情的数据分析与Web网页可视化。电脑系统:Windows使用软件:PyCharm、NavicatPython版本:Python 3.…

Ubuntu20.04 深度学习环境配置(持续完善)

文章目录 常用的一些命令安装 Anaconda创建conda虚拟环境查看虚拟环境大小 安装显卡驱动安装CUDA安装cuDNN官方仓库安装 cuDNN安装 cuDNN 库验证 cuDNN 安装确认 CUDA 和 cuDNN 是否匹配&#xff1a; TensorRT下载 TensorRT安装 TensorRT 本地仓库配置 GPG 签名密钥安装 Tensor…

元宇宙与Facebook:社交互动的未来方向

随着技术的飞速发展&#xff0c;元宇宙逐渐成为全球科技领域关注的焦点。作为一种集沉浸式体验、虚拟空间和数字社交互动为一体的新型平台&#xff0c;元宇宙正在重新定义人类的社交方式。而在这一变革中&#xff0c;Facebook&#xff08;现改名为Meta&#xff09;作为全球领先…

【赵渝强老师】K8s中Pod探针的ExecAction

在K8s集群中&#xff0c;当Pod处于运行状态时&#xff0c;kubelet通过使用探针&#xff08;Probe&#xff09;对容器的健康状态执行检查和诊断。K8s支持三种不同类型的探针&#xff0c;分别是&#xff1a;livenessProbe&#xff08;存活探针&#xff09;、readinessProbe&#…

python 语音识别

目录 一、语音识别 二、代码实践 2.1 使用vosk三方库 2.2 使用SpeechRecognition 2.3 使用Whisper 一、语音识别 今天识别了别人做的这个app,觉得虽然是个日记app 但是用来学英语也挺好的,能进行语音识别,然后矫正语法,自己说的时候 ,实在不知道怎么说可以先乱说,然…

Node.js——body-parser、防盗链、路由模块化、express-generator应用生成器

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

PPT演示设置:插入音频同步切换播放时长计算

PPT中插入音频&同步切换&放时长计算 一、 插入音频及音频设置二、设置页面切换和音频同步三、播放时长计算 一、 插入音频及音频设置 1.插入音频&#xff1a;点击菜单栏插入-音频-选择PC上的音频&#xff08;已存在的音频&#xff09;或者录制音频&#xff08;现场录制…

3D图形学与可视化大屏:什么是材质属性,有什么作用?

一、颜色属性 漫反射颜色 漫反射颜色决定了物体表面对入射光进行漫反射后的颜色。当光线照射到物体表面时&#xff0c;一部分光被均匀地向各个方向散射&#xff0c;形成漫反射。漫反射颜色的选择会直接影响物体在光照下的外观。例如&#xff0c;一个红色的漫反射颜色会使物体在…

Jenkins未在第一次登录后设置用户名,第二次登录不进去怎么办?

Jenkins在第一次进行登录的时候&#xff0c;只需要输入Jenkins\secrets\initialAdminPassword中的密码&#xff0c;登录成功后&#xff0c;本次我们没有修改密码&#xff0c;就会导致后面第二次登录&#xff0c;Jenkins需要进行用户名和密码的验证&#xff0c;但是我们根本就没…

Qt常用控件 输入类控件

文章目录 1.QLineEdit1.1 常用属性1.2 常用信号1.3 例子1&#xff0c;录入用户信息1.4 例子2&#xff0c;正则验证手机号1.5 例子3&#xff0c;验证输入的密码1.6 例子4&#xff0c;显示密码 2. QTextEdit2.1 常用属性2.2 常用信号2.3 例子1&#xff0c;获取输入框的内容2.4 例…

有没有个性化的UML图例

绿萝小绿萝 (53****338) 2012-05-10 11:55:45 各位大虾&#xff0c;有没有个性化的UML图例 绿萝小绿萝 (53****338) 2012-05-10 11:56:03 例如部署图或时序图的图例 潘加宇 (35***47) 2012-05-10 12:24:31 "个性化"指的是&#xff1f; 你的意思使用你自己的图标&…

Go学习:字符、字符串需注意的点

Go语言与C/C语言编程有很多相似之处&#xff0c;但是Go语言中在声明一个字符时&#xff0c;数据类型与其他语言声明一个字符数据时有一点不同之处。通常&#xff0c;字符的数据类型为 char&#xff0c;例如 &#xff1a;声明一个字符 (字符名称为 ch) 的语句格式为 char ch&am…

本地部署 DeepSeek-R1 模型

文章目录 霸屏的AIDeepSeek是什么&#xff1f;安装DeepSeek安装图形化界面总结 霸屏的AI 最近在刷视频的时候&#xff0c;总是突然突然出现一个名叫 DeepSeek 的玩意&#xff0c;像这样&#xff1a; 这样&#xff1a; 这不经激起我的一顿好奇心&#xff0c;这 DeepSeek 到底是个…

断裂力学课程报告

谈谈你对线弹性断裂力学和弹塑性断裂力学的认识 经过对本课程的学习&#xff0c;我首先认识到断裂力学研究的是宏观的断裂问题&#xff0c;而不是研究属于断裂物理研究范围的微观结构断裂机理。断裂力学从材料内部存在缺陷出发&#xff0c;研究裂纹的生成、亚临界拓展&#xff…

【机器学习】自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

一、使用pytorch框架实现逻辑回归 1. 数据部分&#xff1a; 首先自定义了一个简单的数据集&#xff0c;特征 X 是 100 个随机样本&#xff0c;每个样本一个特征&#xff0c;目标值 y 基于线性关系并添加了噪声。将 numpy 数组转换为 PyTorch 张量&#xff0c;方便后续在模型中…

高性能消息队列Disruptor

定义一个事件模型 之后创建一个java类来使用这个数据模型。 /* <h1>事件模型工程类&#xff0c;用于生产事件消息</h1> */ no usages public class EventMessageFactory implements EventFactory<EventMessage> { Overridepublic EventMessage newInstance(…