(五十四)大白话索引的页存储物理结构,是如何用B+树来实现的?.md

news/2024/7/6 1:43:16

上一次我们给大家说了主键索引的目录结构,只要在一个主键索引里包含每个数据页跟他最小主键值,就可以组成一个索引目录,然后后续你查询主键值,就可以在目录里二分查找直接定位到那条数据所属的数据页,接着到数据页里二分查找定位那条数据就可以了,如下图所示。

image-20230108195117951

但是现在问题来了,你的表里的数据可能很多很多,比如有几百万,几千万,甚至单表几亿条数据都是有可能的,所以此时你可能有大量的数据页,然后你的主键目录里就要存储大量的数据页和最小主键值,这怎么行呢?

所以在考虑这个问题的时候,实际上是采取了一种把索引数据存储在数据页里的方式来做的

也就是说,你的表的实际数据是存放在数据页里的,然后你表的索引其实也是存放在页里的,此时索引放在页里之后,就会有索引页,假设你有很多很多的数据页,那么此时你就可以有很多的索引页,此时如下图所示。

image-20230108195132273

但是现在又会存在一个问题了,你现在有很多索引页,但是此时你需要知道,你应该到哪个索引页里去找你的主键数据,是索引页20?还是索引页28?这也是个大问题

于是接下来我们又可以把索引页多加一个层级出来,在更高的索引层级里,保存了每个索引页和索引页里的最小主键值,如下图所示。

image-20230108195148688

现在就好了,假设我们要查找id=46的,直接先到最顶层的索引页35里去找,直接通过二分查找可以定位到下一步应该到索引页20里去找,接下来到索引页20里通过二分查找定位,也很快可以定位到数据应该在数据页8里,再进入数据页8里,就可以找到id=46的那行数据了。

那么现在问题再次来了,假如你最顶层的那个索引页里存放的下层索引页的页号也太多了,怎么办呢?

此时可以再次分裂,再加一层索引页,比如下面图里那样子,大家看看下图。

image-20230108195201999

不知道大家有没有发现索引页不知不觉中组成了多个层级,搞的是不是有点像一棵树?

没错了,这就是一颗B+树,属于数据结构里的一种树形数据结构,所以一直说MySQL的索引是用B+树来组成的,其实就是这个意思。

我们就以最简单最基础的主键索引来举例,当你为一个表的主键建立起来索引之后,其实这个主键的索引就是一颗B+树,然后当你要根据主键来查数据的时候,直接就是从B+树的顶层开始二分查找,一层一层往下定位,最终一直定位到一个数据页里,在数据页内部的目录里二分查找,找到那条数据。

这就是索引最真实的物理存储结构,采用跟数据页一样的页结构来存储,一个索引就是很多页组成的一颗B+树。

好了,今天讲完之后,基本上就初步让大家对索引这个东西有一个入门了,接下来我们就要比较深入的去分析各种索引的物理存储的原理

理解了索引,后续再讲查询原理和执行计划,你基本就很容易理解了。


http://lihuaxi.xjx100.cn/news/951822.html

相关文章

嵌入式ARM端测试手册——全志T3+Logos FPGA评估板(下)

前 言 本指导文档适用开发环境: Windows开发环境:Windows 7 64bit、Windows 10 64bit Linux开发环境:Ubuntu18.04.4 64bit 虚拟机:VMware15.5.5 进行本文档操作前,请先按照调试工具安装、Linux开发环境搭建相关文档,安装SecureCRT串口调试终端、VMware虚拟机等相关软件。…

PTA L1-062 幸运彩票(详解)

前言:内容包括:题目,代码实现,大致思路,代码解读 题目: 彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的…

超级分时一

1.分时主图 ZRS:CONST(DYNAINFO(3)),NODRAW; A1:3.5*(EMA(CLOSE,48)-EMA(CLOSE,104))ZRS,COLORLIMAGENTA; A2:EMA(A1,36),COLORLIBLUE; MACD:(A1-A2)2ZRS; DRAWKLINE(H,O,L,C); STICKLINE(A1>A2,ZRS,MACD ,1,0),COLORRED; STICKLINE(A1>A2 AND MACD<REF(MACD,1),ZRS,M…

获取 本周、本月、本年 的开始或结束时间

获取 本周、本月、本年 的开始或结束时间 public class DateTimeUtil{// 获取 本周、本月、本年 的开始或结束时间/// <summary>/// 获取开始时间/// </summary>/// <param name"TimeType">Week、Month、Year</param>/// <param name&quo…

条款10:优先考虑限域enum而非未限域enum

通常来说&#xff0c;在花括号中声明一个名字会限制它的作用域在花括号之内。但这对于C98风格的enum中声明的枚举名&#xff08;译注&#xff1a;enumerator&#xff0c;连同下文“枚举名”都指enumerator&#xff09;是不成立的。这些枚举名的名字&#xff08;译注&#xff1a…

3.ffmpeg命令行环境搭建、ffmpeg命令行初步了解

在上章,我们讲过: ffmpeg.exe: 主要用于转码或者剪切的应用程序, 也可以从url/现场音频/视频源抓取输入源ffplay.exe: 主要用于播放视频的应用程序,该应用程序源码是开源的,我们后面章节会去源码分析ffprobe.exe: 主要用于分析视频码流的应用程序, 可以获取媒体文件的详细信息,…

Kubernetes11:配置管理-Secret(实际下载secret插件进行加密)-ConfigMap

Kubernetes11&#xff1a;配置管理-Secret 但是secrei在生产环境中会下载secret插件进行加密。只是老师没演示。 Secret 作用&#xff1a;加密数据存在etcd里面&#xff0c;让Pod容器以挂载Volume方式进行访问 场景&#xff1a;凭证 Base64 &#xff1a; 1、创建secret 加密…

【Leedcode】栈和队列必备的面试题(第二期)

【Leedcode】栈和队列必备的面试题&#xff08;第二期&#xff09; 文章目录【Leedcode】栈和队列必备的面试题&#xff08;第二期&#xff09;一、题目&#xff08;用两个队列实现栈&#xff09;二、思路图解1.定义两个队列2.初始化两个队列3.往两个队列中放入数据4.两个队列出…