【Mysql】索引数据结构深入研究(一)

news2024/11/24 21:02:16

索引

1.什么是索引

  • 数据库概论老师说:索引就是教科书的目录页,你要查哪个内容你就去目录页查询内容在哪。
  • Mysql官网:索引是帮助Mysql高效获取数据的排好序数据结构

2.索引的数据结构

  • 二叉树
  • 红黑树
  • Hash表
  • B-Tree
2.1 二叉树

我们先看如下这组数据:
在这里插入图片描述
假设上述为Mysql中的一张表,存在两列col1、col2且数据如上,现在需要执行一条sql

select * from table where table.col2 = 89;

正常情况下,假设这张表中不存在任何索引,它可能需要一行行的进行匹配,这里有人会问,这些数据不都是挨着一块的吗查询起来应该也很快,这里解释一下:

大伙都知道,Mysql中的数据都是存在我们磁盘上的,磁盘写入数据是一个磁道一个磁道的进行写入,可能我们在今天向Mysql中插入一条col1为1的这一条数据,数据分布在磁盘上的某个位置A,过了好几天在插入col1为2的这条数据,数据分布在磁盘上的某个位置B,这时间间隔内,我们计算机的任何程序都可能往磁盘上进行写入数据,所以,Mysql的数据是在磁盘上随机分布,不一定是紧挨着的,之所以能通过select直观的看到,是mysql将这些数据汇集起来了。

因此我们执行上述Sql的时候需要和磁盘进行IO交互,然后这些IO交互的效率是不高的,所以我们需要一个办法减少这个IO交互次数或者将这个次数控制在一定范围内,因此索引就出现了。

我们将上述col2的数据使用二叉树进行排列
在这里插入图片描述
这里的二叉树的结构每个节点都有个key:value,这里的key存在的数据的值(索引),然后value是存储的是索引所在行数据在文件磁盘的地址(例如:0x07),一般来说树结构的数据查询都是从根节点开始查找,二叉树的特点是树的右边的元素大于父元素,左边的元素小于父元素的,根据这个特性我们来在来分析上述sql。

select * from table where table.col2 = 89;

需要查询的索引值为89,从根节点开始34小于索引值,去右边查找发现第一个元素就是我们需要的,这样只需要经过2次查找就能找出我们的需要的数据,上第一次分析中不存在索引的情况下,我们至少需要6次扫描才能找到,这样索引的效果显而易见。

然后Mysql底层并不是使用二叉树,为什么呢?我们看如下Sql

select * from table where table.col1 = 6;

我们分析col1有存在什么特点,类似于自增ID,数据值依次递增,一般来说索引会是提前维护好,那么我们将col1进行构建索引,那么二叉树维护的索引数据结构是什么样子呢,根据二叉树右边大于左边的特性,如下:
在这里插入图片描述
你会发现这个实际上是一个链表,索引也是存储在磁盘上,我们查询col1=6的数据使用索引和不使用索引进行全表扫描没有任何的性能的提升,因此二叉树对这种单表增长的列数据用二叉树建立索引没有任何效果的提升。

那么有没有好的解决方案呢?如下

2.2 红黑树

红黑树(平衡二叉树)我们来看一下上述数据使用红黑树是如何去维护的如下:

在这里插入图片描述
最终数据结构:
在这里插入图片描述

从上述图中我们可以看到,红黑树其实解决了二叉树单边增长的数据链式的问题,当一边的节点比另一边的节点数量多2节点的时候,它会自己做一次平衡。那么为什么Mysql的底层不使用红黑树作为索引的数据结构呢?其实原因之一就是红黑树的高度是不可控制的,这里我们只有7条数据,假设我们有500万条数据,那么树的高度最大接近于2log(n+1),n就是节点数量500W。这样看来其实如果用红黑树作为Mysql的索引数据结构,其实带来的效率提升也不是特别的明显。

那么红黑树解决了二叉树单边增长的问题,那么有没有一种数据来解决红黑树高度的问题呢?如下:

2.3 B-Tree

B-Tree

  • 叶节点具有相同的深度,叶节点的指针为空
  • 所有索引元素不重复
  • 节点中的数据索引从左到右递增排列
    在这里插入图片描述
    我们来看一下上述的数据,B-Tree是如何去维护的。
    在这里插入图片描述

实际上Mysql最终仍然不是使用B-Tree来作为索引,而是B+Tree,我们先来看一下B+Tree

2.4 B+Tree

在这里插入图片描述
我们再来看下B+Tree最终是如何维护这些数据的,如下图;
在这里插入图片描述
B-Tree和B+Tree都是常用的一种数据结构,他们主要的区别如下:

  1. 结构不同:B-Tree是一种平衡树,每个节点包含键值和指向子节点的指针;而B+Tree是一种多路平衡树,每个节点只包含键值,而子节点的指针都存储在叶子节点中。

  2. 叶子节点不同:B-Tree的叶子节点既包含键值也包含数据,而B+Tree的叶子节点只包含键值和指向数据的指针。

  3. 遍历方式不同:B-Tree的遍历方式是深度优先遍历,而B+Tree的遍历方式是广度优先遍历。

  4. 应用场景不同:B-Tree适用于需要随机访问的场景,如文件系统和数据库索引;而B+Tree适用于需要顺序访问的场景,如范围查询和排序。

总的来说,B+Tree相对于B-Tree具有更高的磁盘利用率和更快的范围查询速度,因此在关系型数据库中被广泛使用。

2.4.B+Tree是如何解决树高度问题

对比上面的红黑树和B+Tree来看,我们知道了红黑树弊端是因为他的高度无法进行控制,那么BTree是如何解决这个问题的呢?

首先我们来看下,B+Tree是如何去查找数据的,如上图,假设我们查找25。(这里我们规定树的高度为3)
1.第一次磁盘IO,加载出第一行索引(页)到内存,在二分法进行数据定位,发现数据在20-49这个区间。
2.第二次磁盘IO,加载出20-49索引区间数据,在二分法进行查找,确认叶子节点数据。
3.第三次磁盘IO,加载叶子节点数据,进行查找数据,叶子节点可能会存储整行数据也有可能是索引所在磁盘空间地址(和数据库引擎有关,后面文章会提到)。
这里我们模拟了整个搜索过程,需要注意的是使用二分法在内存中进行数据比对的开销要远远小于一次磁盘IO的时间,这里会有疑问既然这样,那么为什么不把所有数据存放到一行呢,这里存放到一行的话,如果存在几千万条数据,可能内存吃不消。那么Mysql为什么这样设计呢?

2.4.1索引页

在上面我们提到了一个索引页,索引页是可以横向扩充数据的并且数据是排好序的,那么索引页能存放多少索引数据呢。

SHOW GLOBAL STATUS LIKE 'Innodb_page_size' 

在这里插入图片描述

查询出来的结果大约是16KB的数据,那么16KB能够存放多少数据呢,我们来算下假设数据类型为bigint,一个bigint为8b,然后会有一块空间存放下一个索引页的内存地址(图中箭头指的空白处)在C语言中,这里分配的空间大约为6b,也就是一个索引大约占用14b,16380b/(8b+6b)=1170,大约能存储1170个数据,第一行、第二行类似,我们假设高度为三,那么第三行存储的就是叶子节点了,叶子节点上是有data具体的数据,这个上面也提到了和数据库引擎有关系,但是一般来说1KB的数据足以存储mysql中的一行数据了,也就是说他能存储16条数据。
那么一个高度为3的B+Tree总共能存储的数据量为1170117016=21902400,两千多万条数据。

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

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

相关文章

右向辅助产品需求及交互策略说明书

介绍 Introduction 此文档的范围和目的 Scope and Purpose of This Document 定义并描述功能,功能逻辑,功能与驾驶员、环境和其它要素的依赖性和相互影响。为充分理解功能提供支持,以便支持后续阶段的研发活动。 To define and describe …

Prompt的技巧持续总结

Prompt 有很多网站已经收录了,比如:aimappro 有些直接抄上述网站的作业即可,不过也来看看, 有一些日常提问大概的咒语该怎么写。 1 三种微调下的提示写法 chatgpt时代的创新:LLM的应用模式比较 实际案例说明AI时代大…

在 Navicat Premium 中管理 MySQL 用户-第 1 部分:保护 Root 帐号

第 1 部分:保护 Root 帐号 管理数据库用户是数据库管理员(DBA)的主要职责之一。协调组织中的用户访问数据库的方式通常需要执行许多单独的任务,包括添加新用户,阻止已离开组织的用户的访问权限以及帮助无法登录的用户…

三、MNIST手写数字分类任务项目实战

分类任务和回归任务本质上并没有太大的区别,只是最终得到的结果和损失函数不同而已。 MNIST手写数字分类任务,最终得到的是10个值,也类似一个one-hot编码格式,表示该图片是0-9数字的概率,概率值最大的就是预测的最终结…

如何搭建企业内部Wiki?

企业内部wiki是一种基于web的知识管理系统,它可以帮助企业高效地管理和分享内部的知识和信息。搭建一个企业内部wiki需要考虑很多方面,包括选择合适的wiki软件、搭建服务器、设置权限、培训员工等。本文将介绍如何搭建企业内部wiki,以及如何管…

在职读研填充知识库,人大女王金融硕士项目是获取知识的有效途径

在工作中忙忙碌碌,等休息放空时,反而发现没有以前的快乐了。认识的人越来越多,反而觉得越来越孤独。或许这就是成长的代价。身在职场的我们距退休还有好久,这么漫长的时间不获取新知识怎么能行呢,让我们打开探索的窗户…

IO流(C++)

IO流C C语言的输入与输出流是什么CIO流C标准IO流C文件IO流二进制读写文本读写 stringstream的简单介绍 C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键 盘)读取数据,并将值存放在变量中。printf():…

QtCreator屏蔽指定警告:如C4819等

QtCreator 频繁报出warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。 方法一:(屏蔽此警告) 在工程文件.pro里面添加 # disable C4819 warning QMAKE_CXXFLAGS_WARN_ON -wd481…

【Linux】常用指令快速掌握

Linux常用指令 指令登录添加和删除普通用户ls 指令pwd & cd 指令touch 指令mkdir 指令tree 指令rm 指令man 指令nano 指令cp 指令mv 指令cat & tac 指令echo 指令more 指令less 指令head & tail 指令date & cal 指令find 指令which & whereis 指令alias 指…

【正项级数】敛散性判别(二)

【正项级数】敛散性判别(二) 比值判别法和根植判别法比值判别法和根植判别法例题比值/根植判别法失效时,该怎么处理?例题 比值判别法和根植判别法 比值判别法和根植判别法 例题 例1 一般遇到阶乘,为了方便约分&…

Java凉了吗?还能不能学Java?过来人谈谈看法!

别说Java,前端、python、C、C,哪一个没被提过“凉”?归根结底问题始终都只是一个:人确实改变了行业标准,但是人才过剩并不会造成行业衰退。 不可否认,现在Java技术栈相比前几年确实被不断拉长,难…

解决Tomcat控制台乱码、HTML乱码、system.out.println输出乱码、out.print乱码

开发环境 JDK8、IDEA 2023.1.2 (Ultimate Edition)、Tomcat 9.0.71 Tomcat控制台乱码 第一步:修改Tomcat目录下的 ./conf/logging.properties 文件,将3处UTF-8改为GBK,分别对应下图 IDEA 中的3个控制台的输出 第二步:删掉无用…

MySQL8.0与5.7版本的下载、安装与配置(atguigu)(史上最全最详细)

MySQL8.0与5.7版本的下载、安装与配置(atguigu)(史上最全最详细) 目录 MySQL8.0与5.7版本的下载、安装与配置(atguigu)(史上最全最详细)MySQL 8.0的下载MySQL5.7的下载MySQL8.0的安装…

01-初识threejs

基本概念 场景(Scene):场景是 three.js 中所有 3D 对象的容器。它包含了所有的相机、灯光、几何体、材质、纹理等对象。相机(Camera):相机定义了场景中的视角。它控制了场景中哪些部分会被渲染出来&#x…

逍遥自在学C语言 | 指针和数组的关联

前言 指针和数组之间存在着紧密的关系。在本文中,我们将探讨指针和数组的关系、指针算术和数组遍历、多维数组与指针以及指针数组和数组指针。 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学…

车友俱乐部APP小程序系统开发功能有哪些?

车友俱乐部APP小程序系统开发功能有哪些? 1、用户注册:用户首次使用需要使用个人信息进行注册,创建自己的账户并登录才能使用汽车俱乐部APP小程序系统所提供的各项服务。 2、品牌分类:车友俱乐部根据汽车品牌的不同…

6.16 map和set接口

目录 1 Map接口1.2 特点1.3 继承结构1.4 常用方法1.5 练习:Map常用方法测试2 HashMap2.3 练习:获取HashMap的数据2.4 练习:字符串中字符统计3、 set接口3.1 概述3.2 Set集合的特点3.3 常用方法3.4 HashSet3.5 练习: Set相关测试3.6 练习: Set…

项目管理中,优秀的项目经理必须要善于制定目标

在项目管理中,就像船在大海上航行需要灯塔的指引一样,团队也需要明确的目标来指引前进方向。目标不仅仅是为了指引方向,更是凝聚人心的力量。因此,一个优秀的项目经理必须要善于制定目标,让员工为目标干活,…

云原生安全联防联抗策略玩转微隔离

前言 随着信息技术的发展、互联网的快速普及,越来越多的信息被存储在云端,企业面临的安全问题也日益突出。在《网络安全法》、《数据安全法》等多部法律法规要求下,各行业用户纷纷设立安全部门。不管安全部门里是“一人当关”还是“三三两两…

尖峰平谷电表

尖峰平谷电表是一种新型的电能表,可以分别测量电力资源的尖峰、峰、平、谷和深谷等不同时段的用电量和用电负荷。这种电表的出现是为了帮助电力公司实现节能减排和精细管理的目标,同时也能够帮助用户合理使用电力资源,降低用电浪费和碳排放。…