B+树详解,一次就懂

news2024/11/21 2:34:43

⭐注意:不会直接讲 B+树的结构,会从最简单的二叉树开始讲起来。如果认真看完,我想你对树类型的数据结构的理解又上了一个新的台阶。
⭐如果有误,请大家指出。下文均是在B站学习的过程中,总结的笔记和心得体会

索引结构

MySQL索引是在 存储引擎层 实现的,不同的存储引擎层,有不同的索引结构,主要包含四种索引:

名称简介
B+树索引最常见的索引类型
Hash索引底层是由 哈希表 实现 (⭐性能很强,但是!不支持范围查询)
空间索引(R-tree)是 MyISAM 引擎 的一个特殊索引类型,主要用于地理空间数据类型
全文索引(Full-text)通过建立倒排索引方式,来快速匹配文档。

我们会从 二叉树 到 B+树




1、二叉树


  • 二叉树,实际上就是一个简单的树形数据结构,本身没有什么意义。后来,规定了二叉树的插入顺序,让左子节点的元素永远小于右子节点。这种二叉树,可以快速的查询到某一个元素。

    在这里插入图片描述

    就这样, 二叉搜索树 诞生了。

    • 在理想情况下,二叉树每多一层,可以存储的元素都增加一倍。那么 n个元素的二叉搜索树,对应的树高为log(n)。所以我们查找元素、插入元素的时间也为log(n)。

    • 在不理想的情况下,每个节点元素顺序插入,所有的元素会线性排列,树形结构会退化成链表,就会形成如下图的结构,这样导致查询效率翻倍,为O(n) ———— 二叉搜索树不平衡的问题

    在这里插入图片描述

    • (红黑树,自平衡的二叉树)





2、B 树


1. 多叉搜索树

  1. 上面我们知道了二叉搜索树,实际上多叉树和二叉树的区别就是: 多叉搜索树中的节点,可以存储多个元素。这样,导致多叉搜索树有多个分支
    在这里插入图片描述

  2. 问题:二叉搜索树可以完成节点的高效增删改查,为啥会有多叉树的出现?

  • 即 二叉搜索树不平衡的问题,当数量足够大时,树的深度会越深,查询效率就会越低。
  • 在数据库存储中,树是一种常用的数据结构,其数据会存储在硬盘,那么每一次数据的读写都会在磁盘上进行读写,这一过程非常耗时。
  • 树的深度越大,那么磁盘读写的次数越多,带来的IO开销也越大 (所以设计出了 B树,B树是多叉树的一种)

2. B 树

也叫 多路平衡查找树,实际上就是一颗多叉搜索树



B+ 树


和B 树类似,不过做了一些改变

在这里插入图片描述

  • B+ 树 的特点 ( 从图中看 )

    1. B+ 树的所有元素(数据),全部存放在叶子节点,即 所有的元素都会出现在叶子节点 。(B树 叶子节点和非叶子节点都存储数据)

      • B树 的叶子节点、非叶子节点保存的是数据
      • B+树 的非叶子节点是不保存数据的,只起到索引作用,它的叶子节点才保存数据。

    2. 非叶子节点,不存储数据,起到一个索引的作用

    3. B+ 树 的数据结构中,叶子节点之间形成了单向链表。每一个节点的指针,通过叶子节点指向下一个元素。




B+ 树(MySQL)


MySQL中的 B+ 树,对经典的B+ 树结构进行了一个优化。在原基础上,叶子节点又增加了一条相邻叶子节点的指针。
在这里插入图片描述

  • 从图中可以看到,和 经典的B+树,结构大致一致。唯一不同的是,叶子节点之间形成了双向链表。



Hash索引

  • 图详解:
    • 看左边的表,我们 对 name 字段创建了 Hash索引,并查找 杨逍
    • 首先对 name 采用 hash算法,得到hash值。通过生成的 hash值,映射到槽位 (杨逍,005)。
    • 图中不难看到,005的位置,产生了 hash冲突
    • 我们再对比 005槽位上链表的每一个元素,即可拿到值
  • 特点

    1. 只能用于等值比较(=,in),不支持范围查询(between,>,< … )
    2. 无法利用索引完成排序操作
    3. 查询效率高(在索引中,查询小路是最高的)。在理想情况下,只需要检索一次(不发生Hash冲突的情况下)
  • Memory引擎,支持Hash索引,其他不支持。但是,InnoDB引擎 有自适应 hash 功能,会根据查询条件 自动的将 B+树索引,构建为Hash索引

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

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

相关文章

四、网络层(五)IP组播

目录 5.1 组播的概念 5.2 IP组播的地址 5.3 因特网组管理协议&#xff08;IGMP&#xff09; 5.4 组播路由算法 5.1 组播的概念 为了更好地支持像视频会议这类一对多的通信&#xff0c;需要源主机一次发送的单个分组&#xff0c;能抵达用一个组地址标识的若干台目的主…

【老保姆教程】:Tesseract-OCR图片文字识别

文章目录&#x1f31f;介绍一波&#x1f31f;小安装&#x1f31f;配置环境变量⭐️tesseract-ocr配置⭐️tessdata语言配置⭐️检测环境变量是否安装成功&#x1f31f;语言包的配置使用&#x1f31f;CMD命令框中进行图片识别操作⭐️举例一&#xff1a;识别数字⭐️举例二&…

@PostConstruct(重点,初始化加载)和@PreDestroy 注解

PostConstruct和PreDestroy 注解 PostConstruct和PreDestroy都是属于Bean生命周期的一部分&#xff1b; PostConstruct&#xff1a;在bean创建完成并且属性赋值完成之后来执行初始化方法&#xff0c;常用于:项目启动完成后的初始化操作&#xff0c;比如不经常变的Redis缓存Pr…

二、LVS的安装部署

LVS的安装部署LVS的安装部署一、LVS的安装1、yum安装2、源码包安装二、ipvsadm命令详解LVS 相关软件ipvsadm 命令ipvsadm 工具用法&#xff1a;防火墙标记LVS 持久连接三、部署LVS NAT1、LVS NAT模式注意事项2、实验环境3、部署RS1和RS2的nginx4、将RS1和RS2的网关配置为DR的内…

maven私服

分模块开发时&#xff0c;被引用的模块不可能拷来拷去&#xff0c;应该放在单位内部的某一个服务器上&#xff0c;这就是私服。这里使用nexus作为私服软件。 Nexus ● Nexus是Sonatype公司的一款maven私服产品 ●下载地址 Nexus安装、启动与配置 ● 解压即安装 ● 修改基…

我国登山鞋行业参与者越发广泛带来广阔潜在需求 女性市场值得期待

登山鞋属于户外运动鞋&#xff0c;是专门为爬山和旅行而设计制造的鞋子&#xff0c;具有防水性、防滑性、足部保护功能、耐用性等功能&#xff0c;其中防水性是现代登山鞋的首要功能。 资料来源&#xff1a;中国登山鞋行业发展趋势研究与未来投资分析报告&#xff08;2022-2029…

StarRocks Join Reorder 源码解析

导读&#xff1a;欢迎来到 StarRocks 源码解析系列文章&#xff0c;我们将为你全方位揭晓 StarRocks 背后的技术原理和实践细节&#xff0c;助你逐步了解这款明星开源数据库产品。 本期 StarRocks 技术内幕将介绍 Join Reorder 算法如何找到最优解的原理。 背景介绍 多表 Join…

vue之watchEffect

在Options API中&#xff0c;我们可以通过watch选项来侦听data或者props的数据变化&#xff0c;当数据变化时执行某一些操作。 在Composition API中&#xff0c;我们可以使用watchEffect和watch来完成响应式数据的侦听。 watchEffect用于自动收集响应式数据的依赖&#xff0c;需…

Jmeter实现websocket协议接口测试

一&#xff0e;为了方便使用&#xff0c;首先将jmeter设置成中文&#xff0c;有两种方法&#xff1a; 1.在Jmeter界面进行设置&#xff0c;Options ->Choose Language ->Chinese(Simplified)&#xff0c;这种方法在关闭jmeter重启后又会恢复成默认的英文&#xff0c;如果…

学习Python编程好找工作吗?

说起编程语言&#xff0c;不少人都会推荐学习Python&#xff0c;但很多人对Python不太了解&#xff0c;所以比较好奇“学习Python编程是否好找工作”&#xff0c;关于这个问题&#xff0c;小编通过下文为大家详细解答一下。 从市场情况来讲&#xff0c;Python职位比较多&…

阿里内部进阶学习SpringBoot+Vue全栈开发实战文档

前言 Spring 作为一个轻量级的容器&#xff0c;在JavaEE开发中得到了广泛的应用&#xff0c;但是Spring 的配置烦琐臃肿&#xff0c;在和各种第三方框架进行整合时代码量都非常大&#xff0c;并且整合的代码大多是重复的&#xff0c;为了使开发者能够快速上手Spring&#xff0…

105.(leaflet之家)leaflet态势标绘-聚集地修改

地图之家总目录(订阅之前请先查看该博客) 地图之家:cesium+leaflet+echart+地图数据+地图工具等相关内容的介绍 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html>…

Python函数总结

在Python中&#xff0c;函数是一个带有名字的代码块&#xff0c;可以被反复调用。函数可以帮助你组织和重用代码&#xff0c;使你的程序更整洁&#xff0c;更易于维护。本文将会深入探索Python的秘密 目录 定义函数 自定义函数 内置函数 函数式方程 高阶函数 函数标注 …

Linux5.4.0内存分配器核心代码解析

理论 伙伴系统 核心代码解析 __rmqueue_smallest函数 在zone的free_list上进行搜索,找到符合migratetype的、大小为order的空闲页面块 static __always_inline struct page *__rmqueue_smallest(struct zone *zone, unsigned int order,int migratetype

【TypeScript】常用类型声明详情概述

目录 TypeScript常用类型 类型注解 TS类型概述 原始类型 数组类型 对象类型 函数类型 类型别名 接口 元组 字面量类型 枚举 any类型 typeof操作符 类型推论 类型断言 TypeScript常用类型 TypeScript是JS的超集&#xff0c;TS提供了JS的所有功能&#xff0c;并额…

【Linux】第五部分 网络配置

【Linux】第五部分 网络配置 文章目录【Linux】第五部分 网络配置5. 网络配置5.1 对vmware网络连接的三种模式探讨&#xff0c;Bridged&#xff08;桥接模式&#xff09;、NAT&#xff08;网络地址转换模式&#xff09;、Host-Only&#xff08;仅主机模式&#xff09;Bridged&a…

车企数据治理的障碍是什么?如何解决?

​在全行业数字化转型的浪潮下&#xff0c;底层技术的发展与行业之间的碰撞&#xff0c;正在成为变革的巨大力量&#xff0c;汽车行业也是如此。汽车行业的“数字化转型”是利用新的技术驱动行业的创新与发展&#xff0c;改善用户体验、重构商业模式、降本增效&#xff0c;而这…

跟着pink老师学习第二天的学习总结(1)

1.CSS初始化 <style>/* 清除浏览器默认格式 */*{margin:0;padding:0}/* 斜体文字不倾斜 */em,i{font-style:normal}/* 去掉li的小圆点 */li{list-style:none}img{/* 照顾低版本浏览器,如果图片外面包含链接,会出现边框 */border:0;/* 取消图片底部与边框产生的缝隙 */ve…

element plus + vue3表单第一次数据未清空的bug问题解决

使用框架&#xff1a;element Plus vue3 场景描述&#xff1a; 场景一&#xff1a; 表单的添加和修改功能&#xff0c;公用同一个弹框&#xff0c;点击修改后&#xff0c;点击添加表单显示的是上次修改的数据。 场景二&#xff1a; 点击修改&#xff0c;数据回显到表单&…

谁能主宰智能驾驶赛道?「芯片+感知」是第一主角

得「感知」者&#xff0c;得天下。 这句话依然适用于当今的自动驾驶赛道&#xff0c;实际上从Mobileye开始&#xff0c;到特斯拉&#xff0c;都是如此。尤其是智能化变革的快速演进&#xff0c;对于下游车企来说&#xff0c;具备规控的自研能力&#xff08;更多考虑到系统的体验…