B树系列与MySQL数据库

news2025/2/26 18:18:57

前篇提到B树及其实现:一文看懂---B树及其简单实现_b树实现_且随疾风前行->的博客-CSDN博客

本篇继续谈B树系列的B+树,B*树和它们与MySQL数据库的关系。

目录

B树系列

B+树

B+树的特性:

B*树

B树系列总结

MySQL索引简介

MyISAM

InnoDB

选择B+树


B树系列

B+树

        B+树是B树的变形,是在B树基础上优化的多路平衡搜索树,B+树的规则跟B树基本类似,但是又在B树的基础上做了以下几点改进优化:
1. 分支节点的子树指针与关键字个数相同
2. 分支节点的子树指针p[i]指向关键字值大小在[k[i],k[i+1])区间之间,意味着最左边的子树被删除了,每个关键字下面的子树都是其右子树,也是下一个关键字的左子树
关键点:
3. 所有叶子节点增加一个链接指针链接在一起,这样方便遍历所有节点
4. 所有关键字及其映射数据都在叶子节点出现,意味着 叶子节点的值和分支节点的值有重复,分支节点存的是叶子节点的索引,父亲节点存储是子树的最小值
新增的规则简化了B树孩子比关键字多一个的规则,并且所有值都在叶子上,方便遍历所有节点。

B+树结构如图:

插入过程与B树基本类似,少许不同:

第一次插入的时候要插入两层节点,第一层作为索引,第二层作为叶子节点

后面往叶子插入的过程是一样的,插入满了之后分裂一半给兄弟,往父亲插入的是最小值

B+树的特性:

1. 所有关键字都出现在叶子节点的链表中,且链表中的节点都是有序的。
2. 不可能在分支节点中命中。
3. 分支节点相当于是叶子节点的索引,叶子节点才是存储数据的数据层。

B*树

        B*树相当于是B+树的再变形,将分支节点用指针连接,并且规定每个节点关键字和孩子数量不少于最大数量的2/3

B*树结构

B*分裂规则:B*树的分裂,当一个节点满的时候,如果下一个兄弟节点没满,就将一部分数据移到兄弟节点中,再在原节点中插入关键字,最后修改父亲节点中兄弟节点的关键字,如果兄弟节点也满了,就在原节点与兄弟节点之间增加新的节点,并各自复制1/3的数据到新节点,然后在父节点增加新节点的指针。

所以B*树分配新节点的概率要比B+树低,空间使用率更高

B树系列总结

B树 有序数组+平衡多叉树

B+树 有序数组链表+平衡多叉树

B*树 一颗更丰满的,空间利用率更高(至少为2/3)的平衡多叉树

MySQL索引简介

        MySQL是目前非常流行的开源关系型数据库,免费,可靠性高,速度快,有灵活的插件式存储引擎。

        看上图可以看出数据库的底层是文件系统,使用C的API可创建套接字,连接数据库。

         MySQL中索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的。

MyISAM

        MyISAM引擎是MySQL5.5.8版本之前默认的存储引擎,不支持事务,支持全文索引,使用B+树做索引结构,叶节点data域存放数据记录的地址,存放地址,方便索引树和主键树映射同样的数据。

全文索引:通过关键字的匹配来查询过滤,基于相似度的查询,而不是精确数值比较

以Col1为主键,MyISAM的示意图:

 

        在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。
        如果要在Col2上建立一个辅助索引,则要再构建一棵B+树,data域也是保存数据记录的地址。此索引的结构如下图所示:

 

MyISAM中索引检索的算法:
        首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。MyISAM的索引方式也叫做“非聚集索引”的。

特点:数据文件和索引文件分开存储,索引文件仅保存数据的地址

InnoDB

从MySQL数据库5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。

特点
支持事务,面向在线事务处理的应用(内部实现了操作的原子性)
支持B+树索引,哈希索引,全文索引
使用B+树索引时,实现方式与MyISAM不同
数据文件就是索引文件,辅助索引data域存储相应记录主键的值而不是地址
按主键的搜索高效,但辅助索引搜索需检索两遍索引
InnoDB使用B+Tree作为索引结构时,具体实现方式却与MyISAM截然不同。
1.数据文件就是索引文件,每个节点数据都以文件的形式存储在磁盘上
主索引示意图:

可以看出叶节点包含了数据记录,这种索引方式称为聚集索引。

2.辅助索引data域存储相应记录的主键的值,而不是地址   
所以建立索引的时候,主键树和索引树的叶子节点数据不一样,无法直接映射。
辅助索引示意图:
        聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:查找时要先在索引树找到对应主键的值,然后再用主键的值去主键树再查找一次。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动生成主键。

选择B+树

虽然分支节点只存储key,比较小,但也需要存磁盘中,因为数据量大了内存就存不下,KV结构中的value是存储一行数据的磁盘地址,分支节点映射的磁盘数据可以尽快加载到缓存中。

查找时:使用主键查找效率高:O(logn),直接遍历数据库效率低:O(n)。

创建索引时:相当于使用新的键值创建一棵新的B+树,value指向磁盘数据

相比B树的优势:

所有值都在叶子节点,方便遍历,方便区间查找

对于没有建立索引的字段,全表扫描的遍历方便

分支节点只存储键,分支节点占用空间更小,可以尽量更多地加载到缓存中

B树不用到叶子就能找到值,B+一定要查找到叶子节点,这是B树的一个优势,但是B+树的高度较低,所以二者在这点上差别不大。

注意:

一般数据库要求主键值是不重复的唯一值的字段,冗余时插入时就会报错,如果没有字段可以保持唯一,可以考虑自增主键。

一般数据库不要求索引唯一,MySQL数据库建立索引可以考虑B+树或者哈希表,数据允许冗余。

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

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

相关文章

Sphinx文档生成工具(二)

rst语法 官方的语法手册 行内的样式: #斜体 *message* #粗体 **message** #等宽 不能有换行 message标题 一级标题 ^^^^^^^^ 二级标题 --------- 三级标题 >>>>>>>>> 四级标题 ::::::::: 五级标题六级标题 """"…

Vue+node.js医院预约挂号信息管理系统vscode

网上预约挂号系统将会是今后医院发展的主要趋势。 前端技术:nodejsvueelementui,视图层其实质就是vue页面,通过编写vue页面从而展示在浏览器中,编写完成的vue页面要能够和控制器类进行交互,从而使得用户在点击网页进行操作时能够正…

关于 mysql数据库插入中文变空白 的解决方法

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/129048030 红胖子网络科技的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

Session详解,学习 Session对象一篇文章就够了

目录 1 Session概述 2 Session原理 3 Session使用 3.1 获取Session 3.2 Session保存数据 3.3 Session获取数据 3.4 Session移除数据 4 Session与Request应用区别 4.1 Session和request存储数据 4.2 获取session和request中的值 4.3 session和request区别效果 5 Sess…

Transformer:开启CV研究新时代

来源:投稿 作者:魔峥 编辑:学姐 起源回顾 有关Attention的论文早在上世纪九十年代就提出了。 在2012年后的深度学习时代,Attention再次被翻了出来,被用在自然语言处理任务,提高RNN模型的训练速度。但是由…

数据库(4)--视图的定义和使用

一、学习目的 加深对视图的理解,熟练视图的定义、查看、修改等操作 二、实验环境 Windows 11 Sql server2019 三、实验内容 学生(学号,年龄,性别,系名) 课程(课号,课名,…

收藏|一文掌握数据分析在企业的实际流程

一、数据分析概念 1.1 数据分析 是指用适当的统计分析方法对收集来的大量数据进行分析,将他们加以汇总和理解并消化,以求最大化地开发数据的功能,发挥数据的作用。 1.2 数据分析包括 描述性数据分析(初级数据分析)…

兼职平台小程序【源码好优多】

简介 微信小程序兼职平台以及问答悬赏平台的整合项目,兼职平台以及问答社区,是一个可以用于学生项目开发或者毕设的小型项目。 功能介绍 微信授权登录 用户兼职选择 优质学长/学姐推荐 兼职推荐 问答板块 评论/回复板块 用户个人中心 页面截图 …

深度学习Week15-common.py文件解读(YOLOv5)

目录 简介 一.基本组件 1.1autopad 1.2Conv 1.3 Focus 1.4Bottleneck 1.5BottleneckCSP 1.6 C3 1.7 SPP 1.8Concat 1.9Contract、Expand 二、重要类 2.1非极大值抑制(NMS) 2.2AutoShape 2.3 Detections 2.4 Classify 三、实验 &#x1f…

WGCNA | 值得你深入学习的生信分析方法!~(网状分析-第三步-模块与特征分析)

1写在前面 之前我们完成了WGCNA输入数据的清洗,网络构建和模块识别。😘 而且还介绍了如何对大型数据分级处理,有效地减少了内存的负担。😷 接着就是最重要的环节了,将不同module与表型或者临床特征相联系,进…

共享模型之工具(一)

1.线程池 1.1.线程池产生背景 1>.线程是一种系统资源,每创建一个新的线程都需要占用一定的内存(分配栈内存),在高并发场景下,某一时刻有大量请求访问系统,如果针对每个请求(任务)都创建一个新的线程,那么对内存的占用是相当大的,有可能还出现OOM(内存溢出),甚至会导致整个…

配置中心Config

引入依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.6.RELEASE</version></parent><properties><spring-cloud.version>Finchley.SR…

设计模式:桥接模式让抽象和实现解耦,各自独立变化

一、问题场景 现在对”不同手机类型“的 “不同品牌”实现操作编程(比如: 开机、关机、上网&#xff0c;打电话等) 二、传统解决方案 传统方案解决手机使用问题类图&#xff1a; 三、传统方案分析 传统方案解决手机操作问题分析 1、扩展性问题(类爆炸)&#xff0c;如果我们…

JavaのString类这一篇就够了(包含StringBuffer_Builder)

1.&#x1f957;String类简介 在我们写代码的时候&#xff0c;String总是充斥着前前后后。 但你会不会经常力不从心&#xff0c; “这个*** 字符串怎么** 转换不成功啊” “*** 这个字符串到底是常量还是对象啊” “这*** 字符串内存结构到底* * * 是什么啊” “为啥我的字符串…

Java 在二叉树中增加一行

623. 在二叉树中增加一行中等给定一个二叉树的根 root 和两个整数 val 和 depth &#xff0c;在给定的深度 depth 处添加一个值为 val 的节点行。注意&#xff0c;根节点 root 位于深度 1 。加法规则如下:给定整数 depth&#xff0c;对于深度为 depth - 1 的每个非空树节点 cur…

LeetCode 83. 删除排序链表中的重复元素

原题链接 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 给定一个已排序的链表的头 headheadhead &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;…

Springboot+ElasticSearch构建博客检索系统-学习笔记01

课程简介&#xff1a;从实际需求分析开始&#xff0c;打造个人博客检索系统。内容涵盖&#xff1a;ES安装、ES基本概念和数据类型、Mysql到ES数据同步、SpringBoot操作ES。通过本课&#xff0c;让学员对ES有一个初步认识&#xff0c;理解ES的一些适用场景&#xff0c;以及如何使…

C语言实例|编写C程序在控制台打印余弦曲线

C语言文章更新目录 C语言学习资源汇总&#xff0c;史上最全面总结&#xff0c;没有之一 C/C学习资源&#xff08;百度云盘链接&#xff09; 计算机二级资料&#xff08;过级专用&#xff09; C语言学习路线&#xff08;从入门到实战&#xff09; 编写C语言程序的7个步骤和编程…

30岁了,说几句大实话

是的&#xff0c;我 30 岁了&#xff0c;还是周岁。 就在这上个月末&#xff0c;我度过了自己 30 岁的生日。 都说三十而立&#xff0c;要对自己有一个正确的认识&#xff0c;明确自己以后想做什么&#xff0c;能做什么。 想想时间&#xff0c;过得真快。 过五关斩六将&…

基于圆展开自适应三边测量算法的室内定位

基于圆展开自适应三边测量算法的室内定位 具有无线通信功能的移动设备的日益普及刺激了室内定位服务的增长。室内定位用于实时定位设备位置&#xff0c;方便访问。然而&#xff0c;由于大量障碍物&#xff0c;与室外定位相比&#xff0c;室内定位具有挑战性。全球定位系统非常适…