Mysql系列 -索引数据结构

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

为什么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做存储结构,那就再反复的学习吧

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记|配对样本均数T检验|SPSS常用的快捷键|规范表达|《小白爱上SPSS》课程:SPSS第六讲 | 配对样本均数T检验

目录 学习目的软件版本原始文档配对样本均数T检验一、实战案例二、案例解析三、统计策略四、SPSS操作1、正态性检验2、配对样本T检验 五、结果解读六、规范报告1、规范表格2、规范文字 划重点Tips:SPSS常用的快捷键 学习目的 SPSS第六讲 | 配对样本均数T检验 软件版本 IBM S…

【JavaSE专栏58】“Java构造函数:作用、类型、调用顺序和最佳实践“ ⚙️⏱️

解析Java构造函数&#xff1a;作用、类型、调用顺序和最佳实践" &#x1f680;&#x1f4da;&#x1f50d;&#x1f914;&#x1f4dd;&#x1f504;⚙️⏱️&#x1f4d6;&#x1f310; 摘要引言1. 什么是构造函数 &#x1f914;2. 构造函数的类型与用途 &#x1f4dd;1.…

课题学习(九)----阅读《导向钻井工具姿态动态测量的自适应滤波方法》论文笔记

一、 引言 引言直接从原论文复制&#xff0c;大概看一下论文的关键点&#xff1a; 垂直导向钻井工具在近钻头振动和工具旋转的钻井工作状态下&#xff0c;工具姿态参数的动态测量精度不高。为此&#xff0c;通过理论分析和数值仿真&#xff0c;提出了转速补偿的算法以消除工具旋…

【如何写论文】硕博学位论文的结构框架、过程与大纲分析

硕士论文可以说是毕业前最重要的一部分&#xff0c;也可以说是展示和检验你3年研究生学习的成果的一个考试。硕士论文答辩和检验合格&#xff0c;才能够顺利拿到毕业生和学位证&#xff0c;可见其重要性。 目录 一、基础框架1.1、摘要&#xff08;Abstract&#xff09;1.2、绪论…

PFAF-Net

I 1 _1 1​和I 2 _2 2​是多模态图像&#xff0c;I F _F F​是融合图像。FT 1 _1 1​是基于空间注意力的融合&#xff0c;FT 2 _2 2​是基于通道注意力的融合 作者未提供代码

【贝叶斯回归】【第 1 部分】--pyro库应用

Bayesian Regression - Introduction (Part 1) — Pyro Tutorials 1.8.6 documentation 一、说明 我们很熟悉线性回归的问题&#xff0c;然而&#xff0c;一些问题看似不似线性问题&#xff0c;但是&#xff0c;用贝叶斯回归却可以解决。本文使用土地平整度和国家GDP的关系数据…

1.4 安全服务

思维导图&#xff1a; 1.4 安全服务 定义&#xff1a;在通信开放系统中&#xff0c;为系统或数据传输提供足够安全的协议层服务。 RFC4949 定义&#xff1a;由系统提供的对系统资源进行特殊保护的处理或通信服务。安全服务通过安全机制来实现安全策略。 分类&#xff1a;X.800 …

Flask-SQLAlchemy事件钩子介绍

一、前言 前几天在搜资料的时候无意中看到有介绍SQLAlchemy触发器&#xff0c;当时感觉挺奇怪的&#xff0c;触发器不是数据库层面的概念吗&#xff0c;怎么flask-SQLAlchemy这个ORM框架会有这玩意。 二、SQLAlchemy触发器一个简单例子 考虑到效率博客表中有两个字段&#xf…

ELFK(filebeat)部署

部署环境 主机名ip地址主要软件系统node1192.168.154.70ElasticSearh、KibanaCentos7.5node2192.168.154.60ElasticSearhCentos7.5Apache192.168.154.50Logstash、ApacheCentos7.5Filebeat192.168.154.40FilebeatCentos7.5 Node1节点上安装Filebeat #上传软件包 filebeat-6…

nodejs+vue学生考勤综合平台的设计与实现-计算机毕业设计

在当今高度发达的信息中&#xff0c;信息管理改革已成为一种更加广泛和全面的趋势。 “学生考勤综合平台”是基于Mysql数据库&#xff0c;在 程序设计的基础上实现的。为确保中国经济的持续发展&#xff0c;信息时代日益更新&#xff0c;蓬勃发展。 因此&#xff0c;国内外技术…

【JavaSE专栏56】Java面向对象编程:深入理解类、对象、属性和方法的核心概念

Java面向对象编程&#xff1a;深入理解类、对象、属性和方法的核心概念 &#x1f4da;&#x1f9ec;&#x1f4bb; 摘要引言1. Java中的类和对象 &#x1f4da;&#x1f9ec;1.1 什么是Java类和对象&#xff1f; &#x1f914;1.2 类和对象在面向对象编程中的作用 &#x1f3af…

轻量封装WebGPU渲染系统示例<10>- 容器(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/REntity3DContainerTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 5.…

【C语言初学者周冲刺计划】1.1用筛选法求100之内的素数

目录 1解题思路&#xff1a; 2代码如下&#xff1a; 3运行代码如图所示&#xff1a; 4总结&#xff1a; (前言周冲刺计划:周一一个习题实操&#xff0c;依次类推加一&#xff0c;望各位读者可以独自实践敲代码) 1解题思路&#xff1a; 首先了解筛选法定义&#xff1a;先把…

7.scala方法初探

概述 在 scala 中&#xff0c;方法定义在内中&#xff0c;这点类似于 java &#xff0c;此文说明如何定义方法&#xff0c;及方法一些 用法 相关链接 阅读之前&#xff0c;可以先行浏览一下 官方文档 scala相关文章 定义一个参数的方法 这个例子定义了一个名为 double 方法&a…

软考系统架构师知识点集锦二:软件工程

一、考情分析 二、考点精讲 2.1 软件过程模型 &#xff08;1&#xff09;原型模型 典型的原型开发方法模型。适用于需求不明确的场景,可以帮助用户明确需求。可以分为[抛弃型原型]与[演化型原型] 原型模型两个阶段: 1、原型开发阶段;2、目标软件开发阶段。 &#x…

AI:41-基于基于深度学习的YOLO模型的玉米病害检测

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

辅助驾驶功能开发-功能规范篇(22)-5-L2级辅助驾驶方案功能规范

1.3.5 LKA 系统功能定义 1.3.5.1 状态机 1.3.5.2 状态迁移表 初始状态转移状态转移条件INITOFF系统自检过程中,为 OFF 状态,自检无故障且车辆上次掉电前,为 OFF 状态INITSTANDBY自检无故障,车辆为首次上电,或者上次掉电之前,系统为非 OFF 状态INITFAILURE系统自检故障,…

网络工程师重点总结

网络工程师重点 OSI七层模型三层网络结构信息保护安全等级划分子网作用帧长度IPv4和IPv6自动隧道和手动隧道WLAN接入安全控制中&#xff0c;采用的安全措施看冲突域和广播域数量递归查询和迭代查询区别三次握手和四次握手 OSI七层模型 1.物理层&#xff1a;实现实际终端信号的…

嵌入式基础知识-RSA非对称加密基本原理

之前的文章嵌入式基础知识-信息安全与加密&#xff0c;介绍过数据加密的一些基本概念&#xff0c;对称加密的原理比较简单&#xff0c;加密和解密的密钥相同&#xff0c;而非对称加密&#xff0c;两个密钥不同&#xff0c;本篇就来具体介绍RSA这种非对称加密的密钥计算原理。 …

听GPT 讲Rust源代码--library/std(7)

题图来自 Programming languages: How Google is using Rust to reduce memory safety vulnerabilities in Android[1] File: rust/library/std/src/sys/unix/kernel_copy.rs 在Rust的标准库中&#xff0c;kernel_copy.rs文件位于sys/unix目录下&#xff0c;其主要作用是实现特…