B树和B+树,红黑树作为索引的区别

news2024/11/25 11:44:23

 索引是一种数据结构,帮助我们在mysql表中更高效获取数据的数据结构

常用作为索引的数据结构:二叉树,红黑树,Hash表,B树,B+树

下面的数据表中有两个字段,第一个字段是col1,第二个字段是col2,前面0x07表示这行记录在磁盘里面的地址,现在执行下面的sql语句

select   * from  t   where  t.col2=89;

如果没有索引,需要跟磁盘做六次I/O交互,才能在第六行找到我们要的记录

右边是一颗二叉树,二叉树的每一个结点存key-value,key是索引字段(这里我们以col2字段作为索引,所以结点里面存的key就是col字段的值),value是这行记录的磁盘文件地址(比如说0x07)

显然,有了索引之后,只需要和磁盘做两次I/O即可,就可以找到key=89的结点,然后把这个结点的value值(磁盘中的文件地址)拿出来,去磁盘中的这个地址取出这行记录

用二叉树作为索引的问题是:假如用col1字段作为索引,那么二叉树就会退化成链表

比如执行下面的sql查询语句:select   * from  t   where  t.col1=6;

也就是说用递增列字段作为索引,用二叉树作为索引,意义不大

col1作为索引,如果用红黑树来存储

红黑树在插入新元素过程中,会自我平衡,所以select   * from  t   where  t.col1=6;只需要3次I/O即可

红黑树的树高还是太高了,比如当表里面有500w条记录 (也就是500w个索引),全部放到红黑树里面,树的高度会非常高,可能放完500w个索引,树的高度会达到20,所以可能要进行20次I/O操作,我们希望能够降低树的高度

给红黑树每一个结点分配的空间比较小,可能就只能放一个索引字段

现在将结点的空间变得更大一些,可以放几十几百个索引,这就是多路树(不是二叉树)

现在介绍B树

结点中的索引不重复(没有冗余的索引)

相邻叶子节点之间没有指针进行连接,即不存储相邻结点在磁盘中的文件位置

 

B+树

非叶子结点只存储索引,叶子结点存储索引+data

索引冗余:比如下面的B+树第一层存储了15这个索引字段,第二层又存储了15这个索引字段,第三层还存储了15这个索引字段

最后一层存储了所有的索引

叶子结点之间用指针相连,(存相邻叶子结点的磁盘文件地址)提高区间访问性能

将结点中的数据加载到内存里面,进行二分查找,这个时间和一次I/O的时间相比,可以忽略不计

 另外:不使用哈希表作为索引,是因为哈希表不支持范围查找

select  *   from  table   where  id>=10&&id<=20

B+树与红黑树作比较:

红黑树一个结点空间比较小,只存储一个索引,所以导致数据量太大的时候,树高就会很高,树高的话I/O次数就会更多

但是B+树每个结点空间更大,可以存储很多个索引,树高会更低,所以I/O次数会更少

B+树和B树作比较:

(1)b树非叶子节点,叶子结点都存数据,b+树非叶子结点不存数据,只有叶子节点才存数据

所以这也导致b树进行检索时,可能不用查到叶子结点,数据就已经被查到了

而b+树必须从根节点一路检索到叶子节点,数据才能被检索到

(2)b树叶子节点之间没有任何关系,是独立的,相邻叶子节点之间没有指针进行连接,即不存储相邻结点在磁盘中的文件位置,b+树的叶子节点有指针指向与它相邻的叶子节点

(3)B树没有冗余的重复的索引,B+树的非叶子节点和叶子节点有冗余的,重复的索引
 

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

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

相关文章

如何在Qt中设置背景图片,且不覆盖其它控件

正常情况&#xff0c;我们直接通过在样式表里设置背景图片会出现背景图片覆盖其它控件的情况&#xff0c;比如下面操作&#xff1a; 首先右击空白处&#xff0c;点击改变样式表。 然后选择background-image 然后点击铅笔图标 之后我们要先添加前缀&#xff0c;也就是我们…

使用 Three.js 后处理的粗略铅笔画效果

本文使用Three.js的后处理创建粗略的铅笔画效果。我们将完成创建自定义后处理渲染通道、在 WebGL中实现边缘检测、将法线缓冲区重新渲染到渲染目标以及使用生成和导入的纹理调整最终结果的步骤。翻译自Codrops&#xff0c;有改动。 Three.js 中的后处理 Three.js中的后处理是一…

1.9 实践项目——爬取学生信息

1. 项目简介设计一个 Web 服务器 server.py&#xff0c;它读取 students.txt 文件中的学生数据&#xff0c;以表格的形式呈现在网页上&#xff0c;其中 students.txt 的格式如下&#xff1a;No,Name,Gender,Age1001,张三,男,201002,李四,女,191003,王五,男,21设计一个客户端的爬…

【Junit5】就这篇,带你从入门到进阶

目录 前言 1.前置工作 2、注解 2、断言&#xff08;Assertions类&#xff09; 2.1、断言 匹配/不匹配 2.2、断言结果 为真/为假 2.3、断言结果 为空/不为空 3、用例的执行顺序 3.1、用例执行顺序是怎样的&#xff1f; 3.2、通过order注解来排序 4、参数化 4.1、单…

Firefox 110, Chrome 110, Chromium 110 官网离线下载 (macOS, Linux, Windows)

Mozilla Firefox, Google Chrome, Chromium, Apple Safari 请访问原文链接&#xff1a;https://sysin.org/blog/chrome-firefox-download/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 天下只剩三种&#xff08;主流&am…

feign技巧 - form方式传值

feign技巧 - form方式传值。 0. 文章目录1. 前言2. 调用样例3. 原理解析3.1 feign端序列化参数3.2 SpringMVC服务端解析参数3.3 补充 - 继承关系不会被传递的原因3.4 补充 - 不能使用GET。4. 总结1. 前言 直接正题。 如何使用feign进行fom表单方式的请求调用&#xff0c;以及其…

leaflet 上传KMZ文件,并在map上显示(062)

第062个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中本地上传包kmz文件,解析并在地图上显示图形。在制作本示例的过程中,还有点缺憾,就是kmz中的图片文件没有在jszip中处理好,只能先解压缩后,将图片文件放到public/文件加下,暂时留一个遗憾点,以后再做…

又发现一个ChatGPT体验站,辅助写代码真方便

♥️ 作者&#xff1a;Hann Yang ♥️ 主页&#xff1a;CSDN主页 ♥️ 2022博客之星Top58&#xff0c;原力榜Top10/作者周榜Top13 ♥️ “抢走你工作的不会是 AI &#xff0c;而是先掌握 AI 能力的人” ChatGPT 美国OpenAI研发的聊天机器人程序&#xff0c;于2022年11月30日发…

【刷题笔记】--两数之和Ⅳ,从二叉树中找出两数之和

法一&#xff1a;深度搜索中序遍历双指针 思路&#xff1a;通过中序遍历二叉树得到一个递增的数列&#xff0c;再在这个递增的二叉树中找到这两数。 主要学到双指针这个方法。 对于一般数列&#xff0c;我们要找到两数满足其之和等于目标数&#xff0c;我们一般会进行暴力&a…

C++请求SpringBoot的接口问题记录

问题描述最近忙一个小东西&#xff0c;遇到一个很有意思的问题&#xff0c;记录一下。 需求非常简单&#xff0c;就是java侧提供一个接口给C侧调用。 接口按照业务规范提供出来了&#xff0c;在postman中请求一下&#xff0c;出入参都正常。 关于这个接口请求方式为postJson方式…

C++:提高篇: 栈-寄存器和函数状态:栈指针帧指针详解

栈指针和帧指针前言1、EBP和ESP详解2、push &#xff0c;leave &#xff0c;call汇编指令分析3、下面用一个图总结前言 &#x1f697;&#x1f697;&#x1f697;&#xff1a;在刚接触 ESP和EBP概念时&#xff0c;我一直认为&#xff1a;ESP指向栈顶指针&#xff0c;EBP指向栈…

为什么说百度下个月推出文心一言会被ChatGPT完全碾压

作者&#xff0c;姚远&#xff1a; Oracle ACE&#xff08;Oracle和MySQL数据库方向&#xff09;华为云MVP 《MySQL 8.0运维与优化》的作者中国唯一一位Oracle高可用大师拥有包括 Oracle 10g和12c OCM在内的20数据库相关认证。曾任IBM公司数据库部门经理现在一家第三方公司任首…

操作系统——2.操作系统的特征

这篇文章&#xff0c;我们来讲一讲操作系统的特征 目录 1.概述 2.并发 2.1并发概念 2.1.1操作系统的并发性 3.共享 3.1共享的概念 3.2共享的方式 4.并发和共享的关系 5.虚拟 5.1虚拟的概念 5.2虚拟小结 6.异步 6.1异步概念 7.小结 1.概述 上一篇文章&#xff0c;我们…

实时数据仓库

1 为什么选择kafka? ① 实时写入&#xff0c;实时读取 ② 消息队列适合&#xff0c;其他数据库受不了 2 ods层 1&#xff09;存储原始数据 埋点的行为数据 (topic &#xff1a;ods_base_log) 业务数据 (topic &#xff1a;ods_base_db) 2&#xff09;业务数据的有序性&#x…

论文阅读 - Early Detection of Fake News by Utilizing the Credibility of News

论文链接&#xff1a;https://arxiv.org/pdf/2012.04233.pdf 目录 摘要 1 简介 2 相关工作 2.1 基于特征的方法 2.2 深度学习方法 3 问题表述 4 拟议的框架 4.2 用户可信度预测 4.3 虚假新闻分类 4.3.1 新闻内容表示 4.3.2 融合注意力单元 5 实验 5.1 数…

工厂模式--设计模式

分类&#xff1a; 1、简单工厂&#xff1a;可根据自变量的不同返回不同类的实例 应用&#xff1a;将类名和类的全路径放入到配置文件&#xff0c;通过文件流将内容读取放入到map集合中保存&#xff0c;通过反射读取类全路径读取到该类&#xff0c;然后调用类方法。 详细设计&…

山东大学2022算法期末

接力&#xff1a;山东大学2021算法期末 2022 SDU算法导论期末考试 2020 计科 计算题 三道 35’ (1) 画BFS树 (2) 做DFS说明各种边的分类使用floyd或者矩阵乘法求全源最短路&#xff0c;求最短路矩阵以及前驱矩阵&#xff08;3个点&#xff0c;比较友好&#xff0c;应该没有…

idea推送镜像到desktop报错:Cannot run program “docker-credential-desktop“ 系统找不到指定的文件。

windows Docker 搭建仓库 打开docker desktop 。 打开windows cmd窗口或powershell窗口。 输入"docker run -d -p 5000:5000 --name test registry:2 "运行一个名字叫test的registry容器。 idea配置springboot项目的docker插件 在pom.xml中的plugins中加入下面代码…

Kaldi语音识别技术(五) ----- 特征提取

Kaldi语音识别技术(五) ----- 特征提取 文章目录Kaldi语音识别技术(五) ----- 特征提取一、识别流程二、MFCC特征提取概述三、文件格式文件格式说明提取部分数据修复提取数据提取剩余部分数据四、特征提取特征提取—C特征提取—并行提取特征提取—特征查看五、CMVNCMVN—脚本CM…

SpringMVC执行流程(面试题)

SpringMVC是Spring框架中的组成成员之一&#xff0c;是一个针对于Web开发的一个类似于Servlet技术的一个web应用框架&#xff0c;它包含了MVC架构的特点&#xff0c;让Web变得更加简单。在SpringMVC框架中&#xff0c;一个比较核心的组件就是他的前端控制器&#xff0c;这个前端…