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.mzph.cn/news/719949.shtml

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

相关文章

人工智能编程助手FittenCode和CodeGeex

人工智能编程助手FittenCode和CodeGeex 介绍FittenCode安装使用方法 CodeGeex安装使用方法 介绍 FittenCode和CodeGeex都是代码生成和完成工具&#xff0c;具有自动补充缺失的代码部分、代码翻译、自动生成注释等功能&#xff0c;可以显著提高开发者的工作效率。 FittenCode …

VMwareWorkstation17.0虚拟机安装搭建PcDos2000虚拟机(完整图文详细步骤教程)

VMwareWorkstation17.0虚拟机安装搭建PcDos2000虚拟机&#xff08;完整图文详细步骤教程&#xff09; 一、PcDos20001.PcDos2000简介2.PcDos2000下载 二、创建PcDos2000虚拟机1.新建虚拟机2.类型配置3.类型配置4.选择版本5.命名、存位置6.磁盘容量7.调整虚拟配置7.1 调整虚拟配…

Iceberg Changelog

01 Iceberg Changelog使用 0101 Flink使用 CREATE CATALOG hive_catalog WITH (typeiceberg,catalog-typehive,urithrift://xxxx:19083,clientimecol5,property-version1,warehousehdfs://nameservice/spark );use CATALOG hive_catalog&#xff1b;CREATE TABLE test2( id B…

pytest多重断言插件-pytest-assume

最近准备废弃之前用metersphere做的接口自动化&#xff0c;转战pytest了&#xff0c;先来分享下最近接触到的一个插件&#xff1a;pytest-assume。 在使用这个插件之前&#xff0c;如果一个用例里面有多个断言的话&#xff0c;前面的断言失败了&#xff0c;就不会去执行后面的断…

flutter打包命令

apk Build and release an Android app | FlutterHow to prepare for and release an Android app to the Play store.https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration flutter build apk --split-per-abi 如果不同cpu架构不打到同一个…

数组初始化(指定下标初始化)

在C语言中&#xff0c;在C99标准之后&#xff0c;就可以使用指定初始化器&#xff08;designated initializers&#xff09;来初始化数组或结构体中特定的元素。指定初始化器在初始化数组时允许显式地指定一个或多个索引及其相应的值&#xff0c;对于未显式初始化的元素&#x…

EI论文部分复现:含VSC-HVDC的交直流系统内点法最优潮流计算Simulink模型!

适用平台&#xff1a;MatlabSimulink&#xff1b;复现内容&#xff1a;VSC-HVDC模型 简介 高压直流传输系统主要包括换流站、输电线路和终端设备&#xff0c;其中换流站起着关键作用&#xff0c;他可以实现交流整流和直流逆变。常见的HVDC系统有全桥式、半桥式和两水平VSC等。…

C语言数组案例编程

1. 编写一个程序实现&#xff1a;从键盘输入15个整数存入数组&#xff0c;然后统计其中正整数的个数。 【要求】采用函数编程 #include<stdio.h> void input(int a[],int n) {int i; for(i0;i<n;i)scanf("%d",&a[i]); }int positiveNum(int a[],int n…

【Golang入门】简介与基本语法学习

概述&#xff1a; Golang&#xff0c;又称Go语言&#xff0c;是一种编译型、并发性强的编程语言&#xff0c;由Google公司的Robert Griesemer、Rob Pike及Ken Thompson于2007年开发。Go语言的设计初衷是为了解决多核处理器、网络系统和大规模代码库带来的开发困难。它提供了出色…

Vue 3 中如何使用 provide 和 inject 实现依赖注入?

在 Vue 3 中&#xff0c;provide 和 inject 是一对用于实现依赖注入的 API。它们提供了一种方式&#xff0c;让祖先组件能够向其所有子孙后代组件注入依赖&#xff0c;而无需通过 props 逐层传递。这在开发大型复杂应用时&#xff0c;尤其是当组件层级较深时&#xff0c;可以极…

【Kotlin学习路线】讲解

Kotlin学习路线 1. Kotlin介绍2. 入门阶段3. 进阶阶段4. 实战阶段5. 持续学习与专业提升 1. Kotlin介绍 Kotlin 是一种静态类型编程语言&#xff0c;运行在 Java 虚拟机上&#xff0c;并可以交互使用 Java 代码&#xff0c;它由 JetBrains 公司于2011年首次推出&#xff0c;后…

基于springboot+vue的社区智慧养老监护管理平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Apache Calcite 快速入门指南

Apache Calcite 快速入门指南 参考地址&#xff1a;Apache Calcite 快速入门指南 - 知乎 Apache Calcite 是一个动态数据管理框架&#xff0c;提供了&#xff1a;SQL 解析、SQL 校验、SQL 查询优化、SQL 生成以及数据连接查询等典型数据库管理功能。Calcite 的目标是 One Size …

python第二十节闭包函数与装饰器

闭包函数与装饰器 闭包函数闭包的构成条件闭包如何理解 装饰器函数装饰器一函数装饰器二类装饰器一类装饰器二 闭包函数 闭包的构成条件 在函数嵌套&#xff08;函数里面再定义函数&#xff09;的前提下内部函数使用了外部函数的变量&#xff08;参数&#xff09;外部函数的返…

C++/Qt 元类型——枚举 序列化与反序列化

/*** brief 枚举转字符串* tparam T 枚举类型* param s 枚举类型变量* return 字符串*/ template <typename T> inline QString EnumToString(T s) {// T是枚举类型&#xff0c;编译判断static_assert(std::is_enum<T>::value, "T must be an enum type"…

Android logcat系统

一 .logcat命令介绍 android log系统: logcat介绍 : logcat是android中的一个命令行工具&#xff0c;可以用于得到程序的log信息. 二.C/Clogcat访问接口 Android系统中的C/C日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别&#xff1a; /…

mysql binlog禁用

要禁用 MySQL 的二进制日志&#xff08;binlog&#xff09;&#xff0c;你可以通过以下步骤进行操作&#xff1a; 临时禁用&#xff1a; 如果你只是想临时禁用二进制日志&#xff0c;你可以使用以下 SQL 命令&#xff1a; sql SET sql_log_bin 0; 这只会影响当前的会话。当…

Linkedln领英账号限制问题|通过代理IP安全使用Linkedln

LinkedIn是跨境外贸必备的拓客工具&#xff0c;世界各地的许多专业人士都使用领英来作为发布和共享内容的主要工具&#xff0c;这使得它成为跨境出海必备的渠道工具。 但是不少做外贸的朋友都知道&#xff0c;领英账号很容易遭遇限制封禁&#xff0c;但如果善用工具&#xff0…

【数据集】ENSO-基于NOAA发布ONI值

NOAA-ONI&#xff08;Oceanic Nino Index&#xff09; ENSO划分标准&#xff1a; 当某ENSO年的指数值连续6个月大于0.5 ℃时&#xff0c;将该年归类为El Nio年当低于-0.5℃时&#xff0c;将其归类为La Nia年否则&#xff0c;年份为中性。 数据下载 注意&#xff1a;此页面将…

改造muduo,不依赖boost,用C++11重构

组件的实现 1. 序 1.1. 总述 muduo库是基于多Reactor-多线程模型实现的TCP网络编程库&#xff0c;性能良好。如libev作者&#xff1a;“One loop per thread is usually a good model”&#xff0c;muduo库的作者陈硕在其《Linux多线程服务端编程》中也力荐这种“One loop pe…