MYSQL07高级_Hash结构、平衡二叉树、B树、B+树介绍

文章目录

  • ①. 全表遍历
  • ②. Hash结构
  • ③. 平衡二叉搜索树(AVL)
  • ④. B树
  • ⑤. B+树
  • ⑥. 时间复杂度

选择的合理性

  1. 磁盘的I/O操作次数对索引的使用效率至关重要
  2. 查找都是索引操作,一般来说索引非常大,尤其是关系型数据库,当数据量比较大的时候,索引的大小有可能几个G甚至更多,为了减少索引在内存的占用,数据库索引是储存在外部磁盘上的。当我们利用索引查询的时候,不可能把整个索引全部加载到内存,只能逐一加载,那么MYSQL衡量查询效率的标准就是磁盘IO的次数

①. 全表遍历

  • 一行行去寻找记录,假设现在需要查找的数据在最后一行,那么就要从第一行遍历到最后一行,需要把所有的页都加载到内存,耗时且占内容

②. Hash结构

  • ①. Hash本身就是一个函数,又被称为散列函数,Hash算法是通过某种确定性的算法(比如MD5、SHA1等)将输入转变为输出。相同的输入永远可以得到相同的输出,假设输入内容有微小偏差,在输出中通常会有不同的结果

  • ②. 加速查找速度的数据结构,常见的有两类:

  1. 树,例如平衡二叉搜索树,增删改查的平均时间复杂度都是O(log2 n)
  2. 哈希,例如HashMap,增删改查的平均时间复杂度都是O(1)

在这里插入图片描述

  • ③. Hash结构效率高,为什么索引结构要设计成树型呢?
  1. Hash索引仅能满足(=)(<>)和in查询,如果进行范围查询 ,哈希型的索引,时间复杂度会退化为O(n),而树状的"有序"特性,依然能够保持O(log2N)的高效率
  2. Hash索引还有一个缺陷,数据的储存是没有顺序的 ,在ORDER BY 的情况下,使用hash索引还需要对数据重新排序
  3. 对于联合索引的情况,Hash值是将联合索引键合并后一起来计算的,无法对单独的一个或者几个索引键进行查询
  4. 对于等值查询来说,通常Hash索引的效率更高,不过也存在一种情况,就是索引列的重复值如果有很多,效率就会降低。 这是因为遇到Hash冲突时,需要遍历中的指针进行比较,找到查询关键字,非常耗时。比如列为性别、年龄的情况等
  • ④. Hash索引适合储存引擎如表所示:
    在这里插入图片描述
  • ⑤. InnoDB本身不支持Hash索引,但是提供自适应Hash索引。什么情况下才会使用自适应Hash索引呢?如果某个数据经常被访问,当满足一定条件的时候,就会将这个数据页的地址存放到Hash表中,这样下次查询的时候,就可能直接找到页面的所在位置,这样让B+树也具备了Hash索引的优点
  1. 采用自适应Hash索引目的是方便根据SQL的查询条件加速定位到叶子节点,特别是当B+树比较深的时候,通过自适应Hash索引可以明显提高数据的检索效率
  2. 我们可以通过innodb_adaptive_hash_index变量来查看是否开启了自适应Hash,比如
show variables like '%adaptive_hash_index%';

在这里插入图片描述

在这里插入图片描述

③. 平衡二叉搜索树(AVL)

  • ①. 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
    在这里插入图片描述

  • ②. 每访问一次节点就需要进行一次磁盘I/O操作,对于上面的树来说,我们需要进行5次I/O操作。虽然平衡二叉树的效率高,但是树的深度也同样高,这就意味着磁盘I/O操作次数多,会影响整体数据查询的效率

  • ③. 针对同样的数据,如果我们把二叉树改为M叉树(M>2)呢?当M=3,同样的31个节点可以由下面的三叉树来进行储存
    你就能看到此时树的高度降低了,当数据量N大的时候,以及树的叉树M大的时候,M叉树的高度会远小于二叉树的高度(M>2)。所以,我们需要把树从"瘦高"变"矮胖"
    在这里插入图片描述

④. B树

  • ①. B树,也叫多路平衡查找树,它的高度远小于平衡二叉树的高度。

  • ②. 特点:

  1. B树在插入和删除节点的时候如果导致树不平衡,就通过自动调整节点的位置来保持树的自平衡
  2. 关键字集合分布在整棵树中,即叶子节点和非叶子节点都存放数据。搜索有可能在非叶子节点结束

在这里插入图片描述

⑤. B+树

  • ①. B+树和B树的对比
  1. B+树中间节点不直接储存元素,B树的叶子节点和非叶子节点都储存元素
  2. B+树的查询效率更稳定,因为B+树每次只有访问到叶子节点才能找到对应的数据,而在B树中,非叶子节点也储存数据,这样就会造成查询效率不稳定的情况
  3. B+树的查询效率更高。因为B+树比B树更矮胖(阶数更大,深度更低),查询所需要的磁盘I/O也会更少。同样的磁盘页大小,B+树可以储存更多的节点关键字
  4. 在查询范围上,B+树的效率也比B树高。因为所有关键字都出现在B+树的叶子节点上,叶子节点之间有指针,数据又是递增的,着使得我们范围查找可以通过指针连接查找。而在B树中则需要通过中序遍历才能完成查询范围的查询,效率要低很多
    在这里插入图片描述

⑥. 时间复杂度

在这里插入图片描述

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

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

相关文章

BUUCTF---[BJDCTF2020]藏藏藏1

1.题目描述 2.下载附件&#xff0c;解压之后是一张图片和一个文本 3.把图片放在winhex,发现图片里面包含压缩包 4.在kali中使用binwalk查看&#xff0c;然后使用foremost分离&#xff0c;在使用tree查看分离出来的文件&#xff0c;最后将zip文件使用unzip进行解压。步骤如下 5.…

分巧克力 刷题笔记

/* 分巧克力 解题思路 二分 直接检查看答案是否符合题目条件 对于一块边长分别为x 和y的巧克力\\ 假设我们输入检查的数为k 其能分割成的 k*k 的巧克力的块数为 (x/k)*(y/k) 因为c里面的除法是下取整的所以我们不用考虑奇偶数 是否能整除 将每一块巧克力能分成的k*k的巧克力…

镭速:推动工业设备数据高效汇聚的关键力量

在工业4.0时代&#xff0c;智能制造和工业自动化的快速发展使得工业设备数据汇聚、采集、传输变得尤为重要。这些数据&#xff0c;包括设备运行状态、生产效率、能耗等关键信息&#xff0c;对于企业优化生产流程、提升产品质量、降低成本具有至关重要的作用。然而&#xff0c;在…

jsp阿帕奇安装教程

1.将压缩包解压&#xff0c;存放在自己所知道的位置 2.将软件文件夹打开 使用winr &#xff0c;输入cmd运行打开 输入Java或者Javac&#xff0c;出现一大串之后表明成功 接着在所解压的软件中点开bin这个文件夹&#xff0c;找到startup.bat点击 点击之后会出现黑框&#xff0c…

Mint_21.3 drawing-area和goocanvas的FB笔记(三)

一、改变goocanvas线条自动画线时间间隔 通过系统SIGALRM信号触发&#xff0c;每秒画一条线对于慢温湿度等慢变信号可以应付&#xff0c;但对于快速信号1秒的间隔就太慢了。可以改变方式&#xff0c;通过另外的线程&#xff0c;完成要做的任务。 1. 线程的回调函数 myfunc 2…

javaWebssh酒店客房管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh酒店客房管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

都2024了,软件测试真的就是简单的点点点吗???

软件测试真的就是用手点点这么简单 你的身边&#xff0c;是否有这样一片景象&#xff1f; A:写了几年代码&#xff0c;写不下去了&#xff0c;听说测试很好上手&#xff0c;先来做几年测试 。 B:小文员一枚&#xff0c;想入行 IT&#xff0c;听说测试入门简单&#xff0c;请…

SpringBoot-首页和图标定制

1.静态资源导入 SpringBoot中的静态资源&#xff0c;默认有以下四个路径可以访问&#xff1a; classpath:/META-INF/resources/ classpath:/resources/ classpath:/static/ classpath:/public/ 其中第一个路径&#xff0c;一般不常用&#xff0c;它是来获取用maven导入webj…

4.5.CVAT——视频标注的详细步骤

文章目录 1. 跟踪模式&#xff08;基础&#xff09;2. 跟踪模式&#xff08;高级&#xff09;3. 带多边形的轨迹模式 追踪模式Track mode &#xff08;视频标注使用&#xff09;——类似pr的动画效果 1. 跟踪模式&#xff08;基础&#xff09; 使用示例&#xff1a; 为一系列…

如何创建MinIO存储服务公网地址实现固定TCP域名异地远程访问——“cpolar内网穿透”

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统&#xff0c;它可以100%的运行在标准硬件上&#xff0c;即X86等…

Python 全栈系列231 以数据处理为核心的微服务思考

说明 最初我是专注与做数据分析和建模的&#xff0c;通俗点说也就是pandas和sklearn。照理来说&#xff0c;分析和建模作为一种分工&#xff0c;本身是可以独立于架构的设计和使用的。其实也就是从20年之后&#xff0c;我才开始花比较多的时间研究这一块。 回想了一下原因&am…

【计算机考研】408学到什么程度才能考130?

408考130要比考研数学考130难的多 我想大部分考过408的考生都是这么认为的。408的难点在于他涉及的范围太广了&#xff0c;首先如果你要备考408&#xff0c;你要准备四门课程&#xff0c;分别是数据结构&#xff0c;计算机组成原理&#xff0c;操作系统和计算机网络。 这四门…

Java数据结构----包装类简单认识泛型

目录 一、包装类 1.基本数据类型和对应的包装类 2.装箱和拆箱 3.自动装箱和自动拆箱 二、什么是泛型 三、引出泛型 1.语法 四、泛型类的使用 1.语法 2.示例 3 类型推导(Type Inference) 五、裸类型(Raw Type) &#xff08;了解&#xff09; 六、泛型如何编译…

06 - ip route和route -n的区别

1 ip route和route -n的区别 ip route 和 route -n 都是用于查看和管理Linux系统路由表的命令。但下面是它们的区别&#xff1a; ip route&#xff1a;是Linux系统中的现代工具&#xff0c;它属于iproute2套件&#xff1b;它提供了更多的选项&#xff0c;可以更精确地控制路由表…

反向传播算法(Back Propagation)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 反向传播算法 梯度下降和反向传播是神经网络训练过程中两个非常重要的概念&#xff0c;它们密切相关。梯度下降是一种常用的优化算法&#xff0…

rt thread stdio如何同时生成bin和hex

一、rt thread stdio默认生成bin文件&#xff1a; rt thread stdio 软件编译时&#xff0c;默认生成bin文件&#xff1b; 二、rt thread stdio如何同时生成bin和hex 右键单击-->项目-->属性-->C/C构建-->设置-->构建步骤-->(构建后步骤)命令&#xff1a; …

【Java】Base理论的核心思想和理论三要素

目录 简介 BASE 理论的核心思想 BASE 理论三要素 1. 基本可用 2. 软状态 3. 最终一致性 总结 简介 BASE 是 Basically Available&#xff08;基本可用&#xff09; 、Soft-state&#xff08;软状态&#xff09; 和 Eventually Consistent&#xff08;最终一致性&#xf…

软件分层(数据结构/软件逻辑上分层+举例),相连节点的概念+如何相连,为什么是层状结构(软件分层,网络协议分层+梳理协议顺序),协议分层(打电话例子)

目录 软件分层 介绍 举例 类的继承 虚拟文件系统 线程接口封装 虚拟地址空间 总结 为什么是层状的 软件分层 网络协议 原因 梳理协议顺序 相连节点 协议分层 引入 示例 实际上 逻辑上 制定出协议 软件分层 介绍 通过将软件系统划分为不同的层次,每一层都有…

递归学习资料

思路 例题 package 递归;public class 反向打印字符串 {public static void main(String[] args) {f("ABC",0);}static void f(String str,int n){if (nstr.length()){return;}f(str,n1);System.out.println(str.charAt(n)"");} }多路递归 递归优化 -剪枝…

解决prettier 报错 Delete `␍`

根目录&#xff08;么有的话&#xff09;新建 .prettierrc.js配置文件 module.exports {tabWidth: 2,semi: true,printWith: 80,singleQuote: true,quoteProps: consistent,htmlWhitespaceSensitivity: strict,vueIndentScriptAndStyle: true,// 主要是最后一行endOfLine:aut…