Mysql系列 -索引数据结构

news2024/11/22 11:12:37

索引就是排好序的数据结构,可以帮助我们快速的查找到数据,那么底层的数据到底是如何存储的呢?

为什么InnoDB 用的是B+tree 存储结构?

大家可以看看这个可视化的网站
数据结构和算法的可视化工具
在这里插入图片描述
可以看到数据结构里面有链表,二叉树,AVL,红黑树,Hash,B tree ,B+tree等等,可以点击进入每个数据结构的可视化页面,玩一玩,看看插入时数据是怎么样排序的

1.二叉查找树(Binary Search Trees)

二叉树的特点是左边节点比右边节点小,每个叶子节点下的子节点最多只能有2个,每次插入都会先比较根节点,小的往左边,大的往右边。
在这里插入图片描述

缺点
由于只能有2个叶子节点,所以数据量大的时候树的层级会非常高,而且当插入的数据都是有序的,如下图,就会造成斜树,这样就退化成有序链表了
在这里插入图片描述

2.平衡搜索二叉树(AVL trees)

解决了斜树的问题,每次插入是时候节点会进行旋转,左小右大,减少了树的高度,非叶子节点最多拥有2个叶子节点,同时树的左右2边层级 相差不会大于1;
在这里插入图片描述

右旋LL:当想左边节的左子节点点插入数据,例如插入10,8,6的时候,为了保持树的平衡,会把10节点进行右旋,试树能够平衡
在这里插入图片描述
左旋RR:当想右边节的右子节点点插入数据,例如插入10,12,14的时候,为了保持树的平衡,会把10节点进行左旋,试树能够平衡

在这里插入图片描述

缺点
虽然解决了斜树的问题,但是还是会造成树的层级太高,每个叶子节点只能有2个子节点,查询的时候会造成IO次数太多

3.红黑树(Red-Black Trees)

在这里插入图片描述

网上有大牛总结了个顺口溜:根节点必黑,新增是红色,只能黑连黑,不能红连红; 爸叔通红就变色,爸红叔黑就旋转,哪边黑往哪边转

缺点
红黑树的缺点是每个叶子节点只能有2个子节点,查询的时候会造成IO次数太多,同时树的层级会非常高

红黑树和AVL树的区别

  • 红黑树不是完全平衡,不会像AVL那样要求左右2边节点的 绝对值差不大于1,它只要求部分达到平衡,但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决。
  • AVL是完全平衡,在增加或者删除节点的时候,旋转的次数比红黑树要多。左右2边节点的 绝对值差不大于1。由于是完全平衡,所有查询效率要比红黑树高
  • 复咋情况下,就是如有删除节点,树要回复平衡,红黑树的复衡效率更高,因为最多只需要旋转3次就能回复平衡,而AVL树可能会旋转多次,效率更低
  • 在实际运用中,如果搜索的次数远远大于插入和删除,那么选择AVL,因为查询效率更高,如果搜索,插入删除次数几乎差不多,应该选择红黑树,因为维护效率更高。

4.Hash

Hash实际上是散列函数,它可以帮助我们大幅提升检索数据的效率,这是因为 Hash 只需要一步就可以找到对应的取值,算法复杂度为 O(1)。Hash 算法是通过某种确定性的算法(比如 MD5、SHA1、SHA2、SHA3);

采用 Hash 进行检索效率非常高,例如查 id = 100的数据,基本上一次检索就可以找到数据,而 B+ 树需要自顶向下依次查找,多次访问节点才能找到数据,中间需要多次 I/O 操作,从效率来说 Hash 比 B+ 树更快。但是,hash 有很多缺点

缺点

  • Hash 索引不能进行范围查询,例如id > 100就无法匹配索引
  • Hash 索引不支持最左匹配原则,例如有联合索引 a_b_c_index,abc3个字段,Hash 索引在计算Hash 值的时候是将abc3个字段合并后再一起计算 Hash 值,不会针对每个索引单独计算 Hash 值。因此如果用到联合索引的一个或者几个索引时,联合索引无法匹配
  • Hash 索引不支持 ORDER BY 排序
  • 当数据量很大时,hash冲突的几率也会很是大,造成hash碰撞

5.B tree(多路平衡查找树)

上面讲到的树有个共同的缺点,就是每个叶子节点只能有2个子节点,这样的话都会造成树的层级太高,IO效率太低。

B-tree 利用了磁盘块的特性进行构建的树。每个磁盘块一个节点,每个节点包含了很关键字。把树的节点关键字增多后树的层级比原来的二叉树少了,这样就变成了N叉树,并且每个节点保存key和value和data,这样的存储方式的好处就是只要查询到对应数据的键值,就直接返回data,大大提高了查询效率,减少数据查找的次数和复杂度
在这里插入图片描述

缺点
这样的存储结构有个缺点,就是由于每个节点都保存了key-value-data,那么一旦这个data的数据量大的话,例如这个数据有1k,10k或者更多,那么一个磁盘块(默认16KB)就无法保存这么多节点了,因为空间是有限的,保存不了的话就会生成子节点,这样的话树的高度又增加了,磁盘IO又多了,于是B树进行优化,就有了B+树

6.B+tree

B+树和 B树最大的不同是非叶子节点只储存key和value信息,没有data,data 只保存在叶子节点上。这样做的好处是一个磁盘块可以存更多的节点,因为不需要存data了,树的高度就更矮了IO次数更低。

而且所有的叶子节点都是有序的双向链表,所有数据是按照顺序排列的,这样做的好处是范围查找,排序查找,分组查找的效率更高了,举个例子,例如查 23 < id < 52区间范围的数据,只需要找到23的这个数据,再通过有序链表,找到52,就可以快速的返回范围数据,减少了IO次数,提高查询效率
在这里插入图片描述

7.写在最后

总结了这么多,如果你还是不明白为什么要用B+tree做存储结构,那就再反复的学习吧

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

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

相关文章

@ModelAttribute注解之如何使用postman传递参数

代码实例&#xff1a; GetMapping("/selectOpenList")ApiOperation(value "公开问卷列表")AnonymityAnnotation(access true)public WebResponse<PageInfo<QuestionnaireVo>> selectOpenList(ModelAttribute QuestionnaireDto dto){xxxxxxxx…

如何在3dMax中创建具有自定义图标和MaxScript的自定义按钮?

如何在3dMax中创建自定义按钮? 在本教程中,将向您展示如何创建具有自定义图标组和MaxScript的自定义按钮。 在3dMax中,主工具栏上有许多按钮。许多3dMax用户会问:是否可以制作一个带有自定义图像图标的自定义按钮,该按钮后面有自定义MaxScript代码来实现一定的功能?那么…

rust代码学习笔记(未完待续10/31)

文章目录 一、案例一&#xff1a;读取输入打印出来二、案例二&#xff1a;&#xff08;引入新包&#xff09;猜数字游戏三、案例三&#xff1a;循环猜测数字四、案例四&#xff1a;猜字游戏&#xff08;彩色版本&#xff09;五、rust一些注意事项1&#xff09;声明变量默认是不…

C# 如何反射获取常量值

首先&#xff0c;常量是一个字段&#xff0c;所以需要从字段中获取该值。 但是需要传入的BindingFlags是什么&#xff0c;与其盲猜&#xff0c;不如直接反射所有字段值&#xff0c;查看其中的常量有哪些特性和bool值来判断。 ...static void Main(string[] args){var type typ…

禁止使用Lombok,在Lombok的加持下,“小狗”.equals(“老狗”) = true

目录 一、禁止使用Lombok1、jdk版本问题2、被迫营业3、可读性差 二、Lombok中的真实小坑三、看看编译后的代码&#xff0c;到底怎么回事1、编译class2、添加一个注解EqualsAndHashCode(callSuper true) 大家好&#xff0c;我是哪吒。 一、禁止使用Lombok 我有一个同学&#…

VASSAL 3.7.4 发布,开源棋牌游戏构建引擎

导读VASSAL Engine 3.7.4 版本现已发布。VASSAL 是一个游戏引擎&#xff0c;用于在线构建棋盘游戏和纸牌游戏&#xff0c;构建的游戏可在 Internet 上或通过电子邮件实时运行。 VASSAL Engine 可在所有平台上运行&#xff0c;是免费的开源软件。具体更新内容包括&#xff1a; …

【2024版】最新Nessus工具安装激活教程,三分钟手把手教会,非常简单!收藏这一篇就够了

Nessus工具介绍 Nessus号称是世界上最流行的漏洞扫描程序&#xff0c;而且它开源&#xff0c;全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务&#xff0c;并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件&#xff0c;Nessus可同时在本机或远端上…

护眼灯亮度多少合适?适合学生儿童的护眼灯推荐

为什么需要购买台灯&#xff1f;正常的顶灯不行吗&#xff1f; 正常顶灯的光照射到桌子上时&#xff0c;已经发散的差不多了&#xff0c;无法满足看书写字环境下的需要。 看书写字时人是要低头的&#xff0c;很容易挡住顶灯照射的光&#xff0c;桌上需要光的位置正好被挡住。…

如何为模型添加光照效果?

1、光照贴图的原理 光照贴图&#xff08;Lightmap&#xff09;是一种用于模拟光照效果的贴图技术。它通过将场景中的光照信息渲染到纹理图像中&#xff0c;然后将其应用到模型表面来实现对光照效果的模拟。光照贴图通常使用灰度图像来表示场景中的光照信息&#xff0c;白色表示…

让GPT替我写vue3代码,看的我血压升高

事情是这样子的&#xff0c;最近在写Vue3相关的代码&#xff0c;就想着能不能让GPT辅助我写代码&#xff0c;于是&#xff0c;我就先写了一个中文的prompt Prompt1: 使用vue3写一个用户登录的页面 分割线内部是GPT的回答&#xff1a; 使用 Vue 3 来创建一个用户登录页面需要涉…

编译源码时报错,程序包找不到

在编译源码时&#xff0c;出现了个问题&#xff0c;程序包找不到 原本这里是没有这个浮标的&#xff0c;无法打开点击&#xff0c;里面是空的&#xff0c;打开本地maven的库看找到相应的包也是没有问题的。 这里我尝试过删除相关文件&#xff0c;删除pom文件相关内容再次进行下…

Python数据可视化入门指南

Matplotlib和Plotly是两个在Python中广泛使用的数据可视化库&#xff0c;它们具有丰富的API和功能&#xff0c;用于创建各种类型的图表和图形。在本篇博客中&#xff0c;我们将介绍它们的主要特点和基本用法。 Matplotlib 主要特点&#xff1a; 高度自定义&#xff1a; Matp…

赋能制造业高质量发展,释放采购数字化新活力——企企通亮相武汉2023国际智能制造创新论坛

摘要 “为应对成本上升、供应端不稳定、供应链上下游协同困难、决策无数据依据等问题&#xff0c;利用数字化手段降本增效、降低潜在风险十分关键。在AI等先进技术发展、供应链协同效应和降本诉求等机遇的驱动下&#xff0c;采购供应链数字化、协同化成为企业激烈竞争的优先选…

Echats-自定义图表1

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh-cmn-Hans"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>…

设置防火墙

1.RHEL7中的防火墙类型 防火墙只能同时使用一张,firewall底层调用的还是lptables的服务: firewalld:默认 &#xff0c;基于不同的区域做规则 iptables: RHEL6使用&#xff0c;基于链表 Ip6tables Ebtables 2.防火墙的配置方式 查看防火墙状态: rootlinuxidc -]#systemct…

计算机视觉 计算机视觉识别是什么?

计算机视觉识别&#xff08;Computer Vision Recognition&#xff09;是计算机科学和人工智能领域中的一个重要分支&#xff0c;它致力于使计算机系统能够模拟和理解人类视觉的过程&#xff0c;从而能够自动识别、分析和理解图像或视频中的内容。这一领域的发展旨在让计算机具备…

原生JS 表格列拖拽 适用JqGrid

js $(function () {var d1 new dragTable();d1.init({tabel: .drag-table}); })function dragTable() {this.disX 0; // 相对按下的位置移动的距离this.outX 0; // 鼠标按下的点到大盒子边上的距离this.lanX 0; // 拖动到的位置this.$createDiv null;this.$createDivBg …

Java面向对象(进阶)特征之二:继承性

文章目录 一、继承的概述&#xff08;1&#xff09;生活中的继承&#xff08;2&#xff09; Java中的继承1、角度一&#xff1a;从上而下2、角度二&#xff1a;从下而上 &#xff08;3&#xff09;继承的好处&#xff08;4&#xff09;总结 二、继承的语法与应用举例&#xff0…

vue3引入并加载unity工程的两种方式

1、使用unity-webgl插件 npm i unity-webglunity打包后的build文件夹是这样的 需要手动删除.unityweb这个后缀&#xff0c;完成后放在vue3项目的根目录下的public文件夹下。 下面是引入unity的vue组件,其中实例化UnityWebgl时的参数地址直接引用上面的对应文件地址 <scri…

Soul CEO张璐团队创新技术与用户共建,推动网络社交空间绿色发展

近年来,随着互联网社交成为青年人交友的主要方式之一,网络黑灰产业也随之蓬勃发展,新型网络犯罪层出不穷,给用户的安全带来了巨大挑战。为了维护用户的社交安全,国家相关部门不断开展着"净网"、"清朗"等专项行动。在这个背景下,Soul App的CEO张璐及其团队积…