我们在日常中经常操作数据库,mysql数据库是常用的数据库之一,支持多种索引类型,如B+Tree,哈希索引,全文索引等。这次主要研究的就是常用的B+Tree也叫B+树。
什么是B+树?
B+ 树是一种树数据结构,通常用于数据库和操作系统的文件系统中。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入,这与二叉树恰好相反。但是光说概念无疑是晦涩的,下面就来看一下为什么B+树可以作为数据库的主要索引之一。
索引的本质
MySQL官方对索引的说明是索引是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。为什么这里要讲查询算法和数据结构呢?因为之所以要建立索引,其实就是为了构建一种数据结构,可以在上面应用一种高效的查询算法,最终提高数据的查询速度。
要了解数据库索引的底层原理,我们就得先了解一种叫树的数据结构,而树中很经典的一种数据结构就是二叉树!所以就从二叉树到平衡二叉树,再到B树(B-树),最后到B+树来一步一步了解数据库索引底层的原理
二叉树
二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。二叉树有如下特性:
1、每个结点都包含一个元素以及n个子树,这里0≤n≤2。
2、左子树和右子树是有顺序的,次序不能任意颠倒。左子树的值要小于父结点,右子树的值要大于父结点。
那么假设现在有这样一组数[35 27 48 12 29 38 55],顺序的插入到一个数的结构中,得到的结果就会是下面这样。

但是这样的数据对于二叉树有一个问题就是,假如每次插入的数据都比上一个要大,那么这棵树的长度就会越来越大,因为他始终都要在右边插入,这样就变成了一个类似于队列的结构,这无疑是会严重影响查询速度的,所以,为了加快查询速度,就在二叉树的基础上衍生出了平衡二叉树
平衡二叉树
平衡二叉树是一种特殊的二叉树,所以他也满足前面说到的二叉树的两个特性,同时还有一个特性:
它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
这样这棵树就始终满足二叉树的几个特性而保持平衡,树也不会退化为线性链表了,需要查找一个数的时候就能沿着树根一直往下找,这样的查找效率是很快的,查询次数也会大幅度缩减。
但是数据库的数据是存储于硬盘中的,也就是说每次我们查找读取数据,是要通过磁盘的IO进行读写,这个读的效率是固定并且损耗性能的,暂时无法突破,那么假如数据量过于庞大,我们理论最坏需要进行查询的次数变的越来越多的话,就会导致效率变得很低,那么在这个问题上,又进行了优化,我们可以一次多查询一些数据,或者说让树的每一层可以存储更多的节点,这就有了B-Tree(B树)
B-Tree
那B-Tree有哪些特性呢?一棵m阶的B-Tree有如下特性:
1、每个结点最多m个子结点。
2、除了根结点和叶子结点外,每个结点最少有m/2(向上取整)个子结点。
3、如果根结点不是叶子结点,那根结点至少包含两个子结点。
4、所有的叶子结点都位于同一层。
5、每个结点都包含k个元素(关键字),这里m/2≤k<m,这里m/2向下取整。
6、每个节点中的元素(关键字)从小到大排列。
7、每个元素(关键字)字左结点的值,都小于或等于该元素(关键字)。右结点的值都大于或等于该元素(关键字)。
示例如下:

从这个图中我们能看出,B-Tree的查询效率好像也并不比平衡二叉树高。但是查询所经过的结点数量要少很多,也就意味着要少很多次的磁盘IO,这对性能的提升是很大的。
B-Tree的元素就是类似1、2、3这样的数值,但是数据库的数据都是一条条的数据,如果某个数据库以B-Tree的数据结构存储数据,普通的B-Tree的结点中,元素就是一个个的数字。B-Tree把元素部分拆分成了key-data的形式,key就是数据的主键,data就是具体的数据。这样我们在找一条记录的时候,就沿着根结点往下找就ok了,效率是比较高的。

但是IO在读取硬盘的文件的时候也是有限制的,它一次只能读取约4KB的数据,在结点中存储数据无疑也是要浪费IO的读写的,假如一条记录的索引对应的数据过大,大于了4KB的话,那么这一次IO的读写就无法读取其他的记录,导致在树的一层可能会耗费多次IO的读,所以在这基础上又进行了优化,就有了B+Tree(B+树)。
B+Tree
B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构。B+Tree与B-Tree的结构很像,但是也有几个自己的特性:
1、所有的非叶子节点只存储关键字信息。
2、所有卫星数据(具体数据)都存在叶子结点中。
3、所有的叶子结点中包含了全部元素的信息。
4、所有叶子节点之间都有一个链指针。

B-Tree 和 B+Tree的选择
在讲这两种数据结构在数据库中的选择之前,我们还需要了解的一个知识点是操作系统从磁盘读取数据到内存是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理: 当一个数据被用到时,其附近的数据也通常会马上被使用。
预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为4k)。
那么B-Tree和B+Tree该如何选择呢?都有哪些优劣呢?
B-Tree因为非叶子结点也保存具体数据,所以在查找某个关键字的时候找到即可返回。而B+Tree所有的数据都在叶子结点,每次查找都得到叶子结点。所以在同样高度的B-Tree和B+Tree中,B-Tree查找某个关键字的效率更高。
由于B+Tree所有的数据都在叶子结点,并且结点之间有指针连接,在找大于某个关键字或者小于某个关键字的数据的时候,B+Tree只需要找到该关键字然后沿着链表遍历就可以了,而B-Tree还需要遍历该关键字结点的根结点去搜索。
由于B-Tree的每个结点(这里的结点可以理解为一个数据页)都存储主键+实际数据,而B+Tree非叶子结点只存储关键字信息,而每个页的大小有限是有限的,所以同一页能存储的B-Tree的数据会比B+Tree存储的更少。这样同样总量的数据,B-Tree的深度会更大,增大查询时的磁盘I/O次数,进而影响查询效率。
鉴于以上的比较,所以在常用的关系型数据库中,都是选择B+Tree的数据结构来存储数据
相关推荐
【科研学习】Demo3D2015安装包以及图文安装步骤
安装包 点击下图的.exe文件,安装 不需要解压,打开注册机 如下图: 点击上图的.exe文件,出现下图 先点击 patch 打开安装目录下的Demo3D.licensing.dll文件,然后点击Generate,生成dvt-license文件,保存即可 打开安装完成的Demo3D 2015(64-bit),一般破解没完成的,会出现一个request a license 的问题,点击find license 的那一行 点击后找到自己Generate,生成dvt
浅析Mysql索引Innodb及底层存储结构B+树
前言 最近博主在学习mysql索引相关知识,看了很多博客,公开课然后自己总结一下,最近的收获吧。本文从二叉树->平衡二叉树->B树(有同学读B减树,是不正确的) ->B+树 再到B+树在Myisam和Innodb中的体现形式,会提到索引失效的情况,以及创建索引时的一些注意事项及其原理。采用大量的图片+部分文字更加清晰的描述。其中部分图片来源于咕泡学院公开课。 准备 提到my...
使用mne包来对脑电数据进行预处理(一)
MNE(MNE-Python)是一个用于处理脑电(EEG)、磁图(MEG)和其他神经科学数据的Python库。它提供了丰富的功能,包括数据加载、预处理、分析和可视化,旨在帮助研究人员和神经科学家更轻松地进行脑电数据的处理和分析。在本文中,我们使用mne来对不同的格式的脑电数据集进行数据读取。
MySQL性能优化浅析及线上案例
由于order by后边没有索引,就看where条件中是否有合适的索引,查询选择器选定rx_status这个单列索引,而rx_status=5这个条件下限制的数据行在索引中是连续,即使需要的rx_id不在索引中,再回主键聚簇索引也来得及,由于order by后边没有索引,所以走磁盘级别的排序filesort,高峰积压的时候处方就1万到2万,跑到了100ms,白天低谷的时候几百单也就20ms。,由于外部的ID有的是数字有的是字符串,因而导致索引一会可以走到,一会走不到,最终导致了性能的不稳定。
Unity - gamma space下还原linear space效果
还有头发之后的 (头发没有处理完整,因为使用 ASE 连连看练出来的,使用 surface shader,虽然可以生成一下 vert, frag 的方式在修改,但是我懒得去修改了,这样就是 PBR 的 BRDF 里面的部分曲线是不一样的,所以可以看到头发有一些差异)其实上面的代码判断 是否有分量 > 1.0f 的方式来判断是否 HDR 是不太合理的,因为不同的贴图格式的编码方式不同。还有比较隐蔽的一些颜色相关的常量值 (比如PBR中的 绝缘体的 F0 常量值,等等)
AD9253 LVDS 高速ADC驱动开发
对应:data clock时钟为500M DDR mode。具体内容:下文的参考博客写的很清楚,我就不详细写了。参考博客clock align模块不完整,本文新增这个模块。3、该款ADC工作在125Msps下,14bit - 2Lane - 1frame 模式。2、查阅Xilinx xapp524手册。1、查阅AD9253器件手册。
浅析MySQL 8.0直方图原理
本文将对直方图概念进行介绍,借助举例描述直方图的使用方式,对创建/删除直方图的原理进行浅析,并通过例子说明其应用场景。
获取本机正版windows10激活密钥,以及正版office
本方法面向的是以前买过笔记本电脑给你预装了正版系统,激活了正版office(一般是家庭版)的情况,其他情况请自行尝试。
浅析innoDB索引结构
浅析innoDB索引结构 No.1 引言 在上两期分享了innoDB锁机制,innoDB存储结构,相信大家对innoDB也有了一定的了解, 今天将在上期存储结构的基础上,详细聊聊我们平时使用较多的innoDB索引是怎么回事? No.2 课前提问 为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?没有主键怎么办? 为什么非主键索引结构叶子节点存储的...
网格聚类 Grid Clustering/Grid-based Clustering
本文主要简单介绍了网格聚类的基本概念,优缺点,应用场景,建模时的注意事项,评价指标,实现方法,python示例和模型参数等。
7、Python高光谱分析工具(PyHAT)简介
Python高光谱分析工具(PyHAT)是一个开源、跨平台的Python库及图形用户界面,用于行星光谱数据的可视化与分析。它支持多种高光谱传感器数据,如火星勘测轨道飞行器的CRISM、月船1号的M3以及SELENE Kaguya SP点光谱仪,提供预处理、衍生产品生成、统计学习和机器学习分析功能。PyHAT基于Pandas和NumPy构建,兼容Jupyter和QGIS环境,旨在解决现有光谱分析方法缺乏开源实现、难以探索性分析和算法分散的问题。其模块化架构涵盖数据输入/输出、通用光谱变换、测绘与点观测工具及高
MySQL InnoDB 存储引擎原理浅析
MySQL InnoDB 存储引擎原理浅析 版权说明:本文章版权归本人及博客园共同所有,转载请标明原文出处(https://www.cnblogs.com/mikevictor07/p/12013507.html),以下内容为个人理解,仅供参考。 前言: 本文主要基于MySQL 5.6以后版本编写,多数知识来着书籍《MySQL技术内幕++InnoDB存储引擎》,本文章仅记录个人认为比较重要的部分,有兴趣的可以花点时间读原书。 今年的多数学习知识只写在笔记里,较为零散,最近稍有时间整理出来,分享...
KubeVela入门到精通-K8S多集群交付
KubeVela是一个功能强大、易于使用、高度可扩展的应用交付与管理平台。它基于Kubernetes和OAM 技术构建,通过开放应用模型(OAM)来作为顶层的抽像,提供了声明式部署、多集群/混合环境支 持、插件与扩展性、中心化管控以及易于使用与可观测性等特点。
大厂学长发给我的416页Mysql学习笔记,分享给大家
在之前校招面试中,mysql 被问到的频率是真的高,自以为还算精通,经不住面试官刁钻的问题。为了快速补齐,网络上找了不少资料。反而陷入学习凌乱…… 无奈求助一个已经进入大厂的学长,因为他时间比较忙,就塞给了我一本超详细的学习笔记,让我按索引查看不熟悉的地方。真的是超级全面,覆盖了Mysql的所有知识点。现在拿出来分享给大家。一起进步! 整整26个篇幅416页的内容,全程干货!包含最基础的安装、常用命令、SQL分类;介绍mysql中常⽤的数据类型;mysql类型和java类型对应关系; 数据类型选择的⼀些
Probability and Statistics - 4th edition
Probability and Statistics - 4th edition
win10 跳过U8环境检测的IE WebControls.rar
win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。
MySQL中为什么要使用索引合并(Index Merge)?
本文介绍了索引合并(Index Merge)包含的三种类型,即交集(intersection)、并集(union)和排序并集(sort-union),以及索引合并的实现原理、场景约束与通过案例验证的优缺点。
Camera2Demo
在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作
MySQL 学习资源整理
MySQL也有了几年了,说不出来个所以然,认知比较肤浅。所以需要加深学习呀,这里是学习过程中收集的一些好的资源,希望大家共同进步了。不是很系统的整理,看到了就记录了下来。 博客前辈们的博客就是他们成长的足迹。 DimitriK’s (dim) 玄惭 阿里 何登成 阿里 叶金荣 知数堂 姜成尧 网易 杨奇龙 支付宝 penglixun 阿里 王朝阳 大师兄 吴老师 知数堂 黄杉 周振兴 一个
蓝牙模块HM-10手册
蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。
canal 全量同步数据_mysql数据同步:阿里canal入门浅析
坚持原创,共同进步!请关注我,后续分享更精彩!!!介绍canal是阿里开源的一款mysql数据同步工具。纯java开发,基于数据库增量日志解析,提供增量数据的订阅&消费,主要支持mysql。可应用以下业务场景:数据库镜像数据库实时备份多级索引 (卖家和买家各自分库索引)search build业务cache刷新价格变化等重要业务消息工作原理mysql工作原理:从上层来看,复制分成三步:ma...
浅析MYSQL中的分表
我们知道当数据量大到一定程度 比如
Mysql MyISAM引擎相关数据文件浅析
实验环境: OS:Ubuntu 10.04 数据库版本:Mysql 5.5.18 安装路径 :/opt/mysql/ 数据存放位置:/opt/mysql/data 实验一:Mysql将为所有的数据库创建一个单独的文件夹 首先,cd到数据目录下: root@liu-pc:~#cd/opt/mysql/data/ ...
mq同步mysql数据 duplicate entry_mysql数据同步:阿里canal入门浅析
坚持原创,共同进步!请关注我,后续分享更精彩!!!介绍canal是阿里开源的一款mysql数据同步工具。纯java开发,基于数据库增量日志解析,提供增量数据的订阅&消费,主要支持mysql。可应用以下业务场景:数据库镜像数据库实时备份多级索引 (卖家和买家各自分库索引)search build业务cache刷新价格变化等重要业务消息工作原理mysql工作原理:从上层来看,复制分成三步:ma...
mysql学习资源
MySQLMySQL也有了几年了,说不出来个所以然,认知比较肤浅。所以需要加深学习呀,这里是学习过程中收集的一些好的资源,希望大家共同进步了。不是很系统的整理,看到了就记录了下来。官方文档必须要优先看滴呀!本文Github地址博客前辈们的博客就是他们成长的足迹。DimitriK’s (dim)玄惭 阿里何登成 阿里叶金荣 知数堂姜成尧 网易杨奇龙 支付宝penglixun 阿里王朝阳大师兄吴老师 ...
美团java相关技术文章分享
美团数据仓库的演进 搜索引擎关键字智能提示的一种实现 美团性能优化之路——性能指标体系 MySQL索引原理及慢查询优化 Innodb中的事务隔离级别和锁的关系 地理空间距离计算优化 Java内存访问重排序的研究 Kafka文件存储机制那些事 序列化和反序列化
1万+



被折叠的 条评论
为什么被折叠?



