算法之美:B+树原理、应用及Mysql索引底层原理剖析

        B树的一种变种形式,B+树上的叶子结点存储关键字以及相应记录的地址,同等存储空间下比B-Tree存储更多Key。非叶子节点不对关键字记录的指针进行保存,只进行数据索引 , 树的层级会更少 , 所有叶子节点都在同一层, 叶子节点的关键字从小到大有序排列,叶子节点之间用指针连接, 构成有序链表(稠密索引)。

        B+树上每个非叶子节点之间是一个双向链表进行链接,而叶子节点中的数据都是使用单向链表链接。

检索特点

        当索引部分某个结点的关键字与所查的关键字相等时,并不停止查找,继续沿着关键字的指针向下,每次查询必须到叶子节点才能真正获取到相关数据。B+Tree叶子节点相连接,对树的遍历就是只需要一次线性遍历叶子节点。由于叶子节点的数据是顺序排列,方便区间查找,在B+树完成范围查找、排序查找、分组查找、去重查找比B-Tree效率更高。

         动画演示: B+ Tree Visualization

演示:M=5

1)插入可以是中文或者是英文,对应会转为ASCII码 ;

2)插入第五个元素时,会将中间的元素往上提,并在中间保留一个元素在叶子节点,叶子节点间用指针相连;

B-Tree和B+树区别

两种树各有优缺点和应用场景:

1)B树和B+树的最大区别在于非叶子节点是否存储数据;
2)B+树非叶子节点只是当索引使用,同等空间下B+树存储更多key;
3)B树,非叶子节点和叶子节点都会存储数据,找到对应节点就有对应的数据;
4)B+树, 只有叶子节点才会存储数据,存储的数据都是在一行上,找到非叶子节点的key,还需要继续找到叶子节点才可以获取数据;
5)B树的节点包括了key-value,所以找到对应的key即可找到对应的value,不用在继续寻找;
 

Mysql索引底层剖析

在多数数据库的设计里面,会用B-Tree或B+Tree做索引提高查询效率

基于一张数据库的表数据进行查询(类似mysql的user表)

构建索引:id用做key,然后data是数据的存储地址

内存地址idphonenameAge
0xFS21213012341234张三34
0xER32415725112361李四46
0x3246118612695656王五24
0x9352413109910002赵六29
0xAP68913399811341钱七30
0xSQ.... 1千万条数据

精确查找 id = 689 的数据

 sql:select * from user where id = 689

1)未使用索引:自上而下查找数据,一行行遍历,5次才找到数据;
2)使用索引:ID建立主键索引(B+Tree结构),对应的数据存储数据的地址,2次找到数据,且数据量越多效果越明显;

      根节点是常驻内存的,不需要进行IO操作;

        查询ID=689时 ,IO从461才开始发生第一次IO,随之时524、689

范围查找 id>212和  id < 524的用户

 sql:select * from user where id > 212 and id < 524

1)未使用索引:自上而下查找数据,一行行遍历;
2)使用索引:id建立主键索引(B+Tree结构),由于本身是有序链表,所以顺序查找即可;

举一反三 

        如果把相关数据都放到B+Tree叶子节点上,拿查询的时候直接一次性就可以把数据获取了。

以这个为例,我们展开讲讲Mysql中的InnoDB中的索引结构与MyISAM的索引结构区别

InnoDB引擎

        表数据文件按B+Tree组织的,叶节点data域保存完整行数据, 树上的key就是主键, 以主键构建的B+树索引。

        这种索引叫做聚集索引(聚簇索引 clustered index),聚簇索引一般为主键索引,而主键一个表中只能有一个,所以聚集索引一个表只能有一个聚簇索引叶子节点存储的是行数据,而非聚簇索引叶子节点存储的是聚簇索引(通常是主键 ID)

MyISAM引擎

        索引文件和数据文件是分开的,索引结构的叶子节点放的是指向数据的主键(或者是地址)构建的B+树索引。

        这种索引叫做非聚集索引、二级索引、辅助索引(非聚簇索引 nonclustered index),非聚集索引一个表可以存在多个。

       

 叶子节点中保存的不是实际数据,而是主键,获得主键值后去聚簇索引中获得数据行。

        非聚簇索引的叶子节点上存储的并不是真正的行数据,而是主键 ID或记录的地址。当使用非聚簇索引进行查询时,会得到一个主键 ID,再使用主键 ID 去聚簇索引上找真正的行数据,把这个过程称之为回表查询,所以聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,性能不如聚簇索引。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

直流马达驱动芯片D6289ADA介绍

应用领域 适用于智能断路器&#xff08;家用或工业智能空开&#xff09;、新能源汽车充电枪锁、电动玩具、电磁门锁、自动阀门等的直流电机驱动。 功能介绍 D6289ADA是一款直流马达驱动芯片&#xff0c;它有两个逻辑输入端子用来控制电机前进、后退及制动。该电路具有良好的抗干…

如何解决 IntelliJ IDEA 中属性文件的编码问题

在使用 IntelliJ IDEA 进行开发过程中&#xff0c;我们经常会遇到属性文件&#xff08;.properties 文件&#xff09;的编码问题。如果属性文件的编码设置不正确&#xff0c;就会导致中文等特殊字符显示乱码。这是因为IntelliJ IDEA中默认的配置文件的编码格式是ISO-8859-1。 …

36-递归与迭代

36-1 用递归和迭代解决问题 1、求n的阶乘 公式&#xff1a; n!123...(n-1)n。用递归方式定义&#xff1a;0!1&#xff0c;n!(n-1)!n。 代码1&#xff1a; 我们先回忆一下之前用循环怎么实现的吧 非递归&#xff0c;也可称迭代&#xff1a; int main() {int n 0;scanf(&q…

精酿啤酒:酿造工艺的创新与实验探索

在啤酒酿造领域&#xff0c;创新与实验探索一直是推动品质提升和品类丰富的重要动力。Fendi Club啤酒作为一家注重品质和口感的品牌&#xff0c;在酿造工艺方面不断创新与尝试&#xff0c;为消费者带来更多与众不同的风味体验。 Fendi Club啤酒在原料选择方面不断进行创新与实验…

超级码科技股份携手品品香开数字茶业新范式,实现全产业链数智化闭环

品品香白茶创立于1992年&#xff0c;品牌创立的30多年间&#xff0c;品品香不断创新技术、精耕细作、推陈出新&#xff0c;在不同发展时期始终走在行业前沿&#xff0c;助推着白茶产业高质量发展。 2016年&#xff0c;品品香发挥茶产业龙头示范作用率先进行转型&#xff0c;联…

jmeter中参数加密

加密接口常用的方式有&#xff1a; MD5&#xff0c;SHA&#xff0c;HmacSHA RSA AES&#xff0c;DES&#xff0c;Base64 压测中有些参数需要进行加密&#xff0c;加密方式已接口文档为主。 MD5加密 比如MD5加密的接口文档&#xff1a; 请求URL&#xff1a;http://101.34.221…

免费VPS/云服务器整理汇总

随着互联网的普及和云计算技术的飞速发展&#xff0c;越来越多的人开始尝试使用VPS&#xff08;Virtual Private Server&#xff0c;虚拟专用服务器&#xff09;或者云服务器来部署自己的在线业务。本文将对免费VPS/云服务器进行整理汇总&#xff0c;助力大家轻松开启云计算之旅…

顺应互联网发展大潮流,红河农资招商火爆开启

顺应互联网发展大潮流&#xff0c;红河农资招商火爆开启 进入新世纪&#xff0c;生态农业建设成为了影响和改变农村、农业工作的重要领域。尤其是在互联网的快速发展之下&#xff0c;实现农业结构调整&#xff0c;推动互联网模式的发展&#xff0c;成为了当前生态农业发展的主流…

​python学习之变量类型​

print单纯输中的十种数据类型只需要用print()函数即可&#xff0c;()里面直接写变量名。 下面重点介绍print格式输出&#xff1a; 第一种方法&#xff1a;一个萝卜一个坑&#xff0c;下面的代码中&#xff0c;{0}、{1}、{2}分别表示j,i,j*i&#xff0c;单引号里面是输出格式。…

网络七层模型之表示层:理解网络通信的架构(六)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Python中模块

基本概念 **模块 module&#xff1a;**一般情况下&#xff0c;是一个以.py为后缀的文件 ①Python内置的模块&#xff08;标准库&#xff09;&#xff1b; ②第三方模块&#xff1b; ③自定义模块。 包 package&#xff1a; 当一个文件夹下有 init .py时&#xff0c;意为该文…

构建ELK+Filebeat+kafka+zookeeper大数据日志分析平台

主机IP 角色 所属服务层 部署服务 192.168.11.11 日志生产 采集层 filebeat 192.168.11.12 日志缓存 数据处理层、缓存层 Zookeeperkafkalogstash 192.168.11.13 192.168.11.14 日志展示 持久、检索、展示层 Logstashelasticsearchkibana 数据流向 filebeat--…

工业设备故障诊断解决方案 | 流数据实时采集、存储与回放

工业物联网场景中&#xff0c;故障分析是一个关键环节。设备发生故障时&#xff0c;需快速定位原因。实时采集的流式数据和操作日志记录了设备当前的运行状态&#xff0c;如何根据这些数据快速定位故障发生原因是一个值得研究的问题。DolphinDB 历史数据回放框架为故障分析提供…

极速上架:探索常用的苹果应用商店上架工具,提高应用发布效率

摘要 移动应用app上架是开发者关注的重要环节&#xff0c;但常常会面临审核不通过等问题。为帮助开发者顺利完成上架工作&#xff0c;各种辅助工具应运而生。本文探讨移动应用app上架原理、常见辅助工具功能及其作用&#xff0c;最终指出合理使用工具的重要性。 引言 移动应…

【Vue3进阶】- 第2学堂小商城实战课程前言

该教程为进阶教程&#xff0c;如果你还不了解Vue3的基础知识&#xff0c;可以先前往Vue3基础教程&#xff0c;从入门到实战。 学习时遇到的任何疑问都欢迎在相应课文页面下方的问答区进行提问哦 我能学到什么&#xff1f; 编程写法千千万&#xff0c;实现需求是第一。 教程中…

重塑未来:Web3如何改变我们的数字生活

引言 随着科技的飞速发展&#xff0c;Web3已经成为数字时代的新潮流&#xff0c;其革命性的变革正在渐渐改变着我们的数字生活。本文将深入探讨Web3如何改变我们的数字生活&#xff0c;涉及其意义、应用场景、对未来的影响&#xff0c;以及我们如何适应这一变革&#xff0c;为…

MySQL创建表:练习题

练习题&#xff1a; 创建一个名为"students"的数据库&#xff0c;并切换到该数据库。 在"students"数据库中创建一个名为"grades"的表&#xff0c;包含以下字段&#xff1a; id: 整数类型 name: 字符串类型&#xff0c;学生姓名 subject: 字符串…

linux 环境安装配置

安装java17 1.下载安装包 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2.解压到自定义目录/usr/local/java mkdir /usr/local/java tar zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java 3.配置环境变量 echo export PATH$PATH:/…

在线构建自动部署软件JPOM

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 简而轻的低侵入式在…

八大技术趋势案例(虚拟现实增强现实)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…