算法之美: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://www.hqwc.cn/news/583987.html

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

相关文章

Linux基本指令篇

在前边&#xff0c;我们已经了解过了Linux操作系统的发展和应用&#xff0c;从该篇起&#xff0c;就正式进入对Linux的学习。 今天我们就来在Xshell上远程登录我们的云服务器。首先我们要知道自己云服务器的公网ip&#xff0c;然后修改一下密码。 点击跳转 修改完密码之后我们…

跑通飞浆平台的MTMCT 跨镜跟踪示例

想跑通飞浆平台的MTMCT跨镜跟踪示例&#xff0c;真的是难上加难啊&#xff01; 改了几处代码&#xff0c;可以顺利跑通了&#xff0c;特此记录&#xff1a; 第一处&#xff1a;不要拉主线的代码&#xff0c;改成 !git clone https://gitee.com/paddlepaddle/PaddleDetection…

【unity】如何汉化unity Hub

相信大家下载安装unity后看着满操作栏的英文&#xff0c;英文不好的小伙伴们会一头雾水。但是没关系你要记住你要怎么高速运转的机器进入中国&#xff0c;请记住我给出的原理&#xff0c;不懂不代表不会用啊。现在我们就来把编译器给进行汉化。 第一步&#xff1a;我们打开Uni…

pytorch-tpu/llama推理优化之input prompt bucketing

数据更新&#xff1a; python脚本&#xff08;注意分支&#xff09;&#xff1a; HLO图分析KV-Cache更新&#xff1a; KV-Cache作为HLO图的输入输出&#xff1a;bf16[1,2048,32,128]{3,2,1,0} 128x, 2x32x2 参考链接 notes for transformer introduction by an Italian t…

引领向量数据库技术新变革,Milvus 2.4 正式上线

备受关注的 Milvus 2.4 正式上线! 作为向量数据库赛道的领军者,Zilliz 一直致力于推动向量技术的进步与创新。本次发布中,Milvus 新增支持基于 NVIDIA 的 GPU 索引—— CUDA 加速图形索引(CAGRA),突破了现有向量搜索的能力。 GPU 索引是向量数据库技术中的重要里程碑,…

做现货白银,要直面实时行情走势!

现货白银拥有完善的交易机制&#xff0c;它每天的实时行情走势中充满着交易获利的机会&#xff0c;但不见得每一位投资者都有把握住的能力。在各种资讯都触手可及的今天&#xff0c;投资者可以轻松地获得现与货白银相关的交易技巧&#xff0c;然而交易的智慧&#xff0c;则需要…

ubuntu23.10配置RUST开发环境

系统版本: gcc版本 下载rustup安装脚本: curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh下载完成后会自动执行 选择默认安装选项 添加cargo安装目录到环境变量 vim ~/.bashrc 默认已添加 使用环境变量立即生效 source ~/.bashrc 执行rust开发环境,在终端输入…

扫雷(蓝桥杯)

题目描述 小明最近迷上了一款名为《扫雷》的游戏。其中有一个关卡的任务如下&#xff0c; 在一个二维平面上放置着 n 个炸雷&#xff0c;第 i 个炸雷 (xi , yi ,ri) 表示在坐标 (xi , yi) 处存在一个炸雷&#xff0c;它的爆炸范围是以半径为 ri 的一个圆。 为了顺利通过这片土…

19-错误处理(下):如何设计错误包?

业界有很多优秀的、开源的错误包可供选择&#xff0c;例如Go标准库自带的errors包、github.com/pkg/errors包。 错误包需要具有哪些功能&#xff1f; 在我看来&#xff0c;至少需要有下面这六个功能&#xff1a; 首先&#xff0c;应该能支持错误堆栈。 假设保存在bad.go文件…

【MySQL笔记】SELECT COUNT(*) 的时候,加不加where条件有差别吗?

文章目录 前言实验结论 前言 这部分很多帖子都只在问题里罗列下&#xff0c;好像也没详细解答 其实就是跟InnoDB优先走二级索引的优化有关&#xff0c;前面也提到了”优化的前提是查询语句中不包含where条件和group by条件“ 还不太了解这个优化的朋友可以看上一篇帖子 实验 …

如何使用剪映专业版剪辑视频

1.操作界面功能介绍 2.时间线的使用 拖动前端后端缩减时长&#xff0c;有多个素材可以拖动调节前后顺序拼接。 分割视频 删除

CentOs7.9中修改Mysql8.0.28默认的3306端口防止被端口扫描入侵

若你的服务器被入侵&#xff0c;可以从这些地方找到证据&#xff1a; 若有上述信息&#xff0c;300%是被入侵了&#xff0c;重装服务器系统以后再重装Mysql数据库&#xff0c;除了设置一个复杂的密码以外&#xff0c;还需要修改默认的Mysql访问端口&#xff0c;逃避常规端口扫描…