当前位置: 首页 > news >正文

Mysql B+数索引结构

一、B+树和B树区别

二、 B+ 树形成过程

三、页分裂过程

3.1 页分裂过程实例

3.1.1 原有数据1、3、5形成如下数据页

3.1.2 先新插入数据4,因为 页10 最多只能放3条记录所以我们不得不再分配一个新页:

新分配的数据页编号可能并不是连续的,也就是说我们使用的这些页在存储空间里可能并不挨着。它们只是通过维护着上一个页和下一个页的编号而建立了链表关系。另外,页10 中用户记录最大的主键值是 5 ,而 页28 中有一条记录的主键值是 4 ,因为 5 > 4 ,所以这就不符合下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值的要求,所 以在插入主键值为 4 的记录的时候需要伴随着一次记录移动,也就是把主键值为 5 的记录移动到 页28 中, 然后再把主键值为 4 的记录插入到 页10 中,这个过程的示意图如下:

 

这个过程表明了在对页中的记录进行增删改操作的过程中,我们必须通过一些诸如记录移动的操作来始终保 证这个状态一直成立:下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值。这个过程 我们也可以称为 页分裂

 3.2 B+树形成过程

数据页的编号可能并不是连续的,所以在向 i表中插入许多条记录后,可能是这样的效果:

16KB 的页在物理存储上可能并不挨着,如果想从这么多页中根据主键值快速定位某些记录所在的,我们需要给它们做个目录,每个页对应一个目录项,每个目录项包括下边两个部分: 
        1、页的用户记录中最小的主键值,我们用 key 来表示。 
        2、页号,我们用 page_no 表示。

最终形成如下图所示结构:

 3.3 根据目录项查找数据

        页28对应目录项2,这个目录项包含着该页的页号 28 以及该页中用户记录的最小主键值 5 。我们只需要把几个目录项在物理存储器上连续存储,比如把他们放到一个数组里,就可以实现根据主键值快速查找某条记录的功能了。比方说我们想找主键值为 20 的记录,具体查找过程分两步:
1、先从目录项中根据二分法快速确定出主键值为 20 的记录在 目录项3 中 12 < 20 < 209 ,它对应的页是 页9 。
2、根据前边说的在页中查找记录的方式去页9 中定位具体的记录。至此,针对数据页做的简易目录就搞定了。不过忘了说了,这个 目录 有一个别名,称为索引 。

四、InnoDB中的索引方案

4.1 目录项记录

复用了之前存储 用户记录的数据页来存储目录项,为了和用户记录做一下区分,我们把这些用来表示目录项的记录称为 目录项记录 。区分目录项和用户记录使用record_type 属性。
    0:普通的用户记录 
    1:目录项记录 
    2:最小记录 
    3:最大记录

目录项记录和普通的 用户记录 的不同点:
1、目录项记录 的 record_type 值是1,而普通用户记录的 record_type 值是0。
2、目录项记录只有主键值和页的编号两个列,而普通的用户记录的列是用户自己定义的,可能包含很多列,另外还有 InnoDB 自己添加的隐藏列。
3、只有在存储 目录项记录 的页中的主键值最小的 目录项记录 的 min_rec_mask 值为 1 ,其他别的记录的 min_rec_mask 值都是 0 。

4.2 聚簇索引

4.3 二级索引

4.4 联合索引

五、 B+树索引注意事项

5.1 MyISAM中的索引方案简单介绍

InnoDB 中索引即数据,也就是 聚簇索引的那棵 B+ 树的叶子节点中已经把所有完整的用户记录都包含了,而 MyISAM 的索引方案虽然也使用树形 结构,但是MyISAM却将索引和数据分开存储:

将表中的记录按照记录的插入顺序单独存储在一个文件中,称之为 数据文件 。这个文件并不划分为若干个数据页,有多少记录就往这个文件中塞多少记录就成了。我们可以通过行号而快速访问到一条记录。

数据按顺序写入数据文件(不按照主键大小排序),索引信息另外存储到一个称为 索引文件, MyISAM 会单独为 表的主键创建一个索引,叶子节点仅存储 主键值 + 行号;先通过索引找到对应的行号,再通过行号去找对应的记录!MyISAM 中却需要进行一次 回表 操作,相当于全部是二级索引。

 

相关文章:

Mysql B+数索引结构

一、B树和B树区别 二、 B 树形成过程 三、页分裂过程 3.1 页分裂过程实例 3.1.1 原有数据1、3、5形成如下数据页 3.1.2 先新插入数据4&#xff0c;因为 页10 最多只能放3条记录所以我们不得不再分配一个新页&#xff1a; 新分配的数据页编号可能并不是连续的&#xff0c;也…...

在window上配置NASM

NASM是支持x86、x64架构CPU的汇编器(汇编软件)&#xff1b;NASM也支持大量的文件格式&#xff0c;包括Linux&#xff0c;*BSD&#xff0c;a.out&#xff0c;ELF&#xff0c;COFF&#xff0c;Mach−O&#xff0c;Microsoft 16−bit OBJ&#xff0c;Win32以及Win64&#xff0c;同…...

用QT实现MVP模式

近些天用qt 作项目,遇到参数界面.偷闲写个mvp模式示例. mvp模式重要的有两点 1 低耦合: 界面与后端数据类,不直接引用,可方便替换. 2 形成界面驱动-界面更新的闭环.:通过函数指针类技术,让数据自动回流. MVP (Model-View-Presenter) 视图&#xff08;View&#xff09;: 接…...

(2023)Linux安装pytorch并使用pycharm远程编译运行

&#xff08;2023&#xff09;Linux安装pytorch并使用pycharm远程编译运行 安装miniconda 这部分参考我这篇博客的前半部分Linux服务器上通过miniconda安装R&#xff08;2022&#xff09;_miniconda 安装r_Dream of Grass的博客-CSDN博客 创建环境 创建一个叫pytorch的环境…...

poi带表头多sheet导出

导出工具类 package com.hieasy.comm.core.excel;import com.hieasy.comm.core.excel.fragment.ExcelFragment; import com.hieasy.comm.core.utils.mine.MineDateUtil; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import org.apache.po…...

RedisDesktopManager(redis客户端,可输入用户名密码)

RedisDesktopManager&#xff08;redis客户端&#xff0c;可输入用户名密码&#xff09; Redis桌面管理器&#xff08;又名RDM&#xff09; - 是一个用于Windows&#xff0c;Linux和MacOS的快速开源Redis数据库管理应用程序。可以使用url连接或账号密码。 redis设置账号密码后…...

【Adobe After Effects】关于ae点击空格不会播放反而回退一帧的解决方案

最近玩ae的时候遇见了一个小问题&#xff0c;就是有时候敲空格&#xff0c;视频没办法播放&#xff0c;反而会回退一帧&#xff0c;经过摸索发现了一个解决办法&#xff1a; 点击编辑---首选项 然后选择“音频硬件” 然后选择正确的默认输出&#xff0c;点击确定即可...

Linux网络编程:多路I/O转接服务器(select poll epoll)

文章目录&#xff1a; 一&#xff1a;select 1.基础API select函数 思路分析 select优缺点 2.server.c 3.client.c 二&#xff1a;poll 1.基础API poll函数 poll优缺点 read函数返回值 突破1024 文件描述符限制 2.server.c 3.client.c 三&#xff1a;epoll …...

Mybatis系列原理剖析之项目实战:自定义持久层框架

Mybatis系列原理剖析之&#xff1a;项目实战&#xff1a;自定义持久层框架 持久层是JAVA EE三层体系架构中&#xff0c;与数据库进行交互的一层&#xff0c;持久层往往被称为dao层。需要说明的是&#xff0c;持久层的技术选型有很多&#xff0c;绝不仅仅只有mybatis一种。像早…...

阿里云 Serverless 应用引擎 2.0,正式公测!

阿里云 Serverless 应用引擎 SAE2.0 正式公测上线&#xff01;全面升级后的 SAE2.0 具备极简体验、标准开放、极致弹性三大优势&#xff0c;应用冷启动全面提效&#xff0c;秒级完成创建发布应用&#xff0c;应用成本下降 40% 以上。 此外&#xff0c;阿里云还带来容器服务 Se…...

西北大学计算机考研844高分经验分享

西北大学计算机考研844经验分享 个人介绍 ​ 本人是西北大学22级软件工程研究生&#xff0c;考研专业课129分&#xff0c;过去一年里在各大辅导机构任职&#xff0c;辅导考研学生专业课844&#xff0c;辅导总时长达288小时&#xff0c;帮助多名学生专业课高分上岸。 前情回顾…...

【java并发编程的艺术读书笔记】volatile关键字介绍、与synchronized的区别

volatile的简介 volatile是轻量级锁&#xff0c;只用来修饰变量&#xff0c;保证这个变量在多线程下的可见性以及一致性&#xff08;一个volatile变量被线程修改时会立刻通知其他所有线程&#xff09;&#xff0c;防止指令重排序&#xff0c;但是并不能保证绝对的线程安全 vol…...

LinkedList的顶级理解

目录 1.LinkedList的介绍 LinkedList的结构 2.LinkedList的模拟实现 2.1创建双链表 2.2头插法 2.3尾插法 2.4任意位置插入 2.5查找关键字 2.6链表长度 2.7遍历链表 2.8删除第一次出现关键字为key的节点 2.9删除所有值为key的节点 2.10清空链表 2.11完整代码 3.…...

再学http-为什么文件上传要转成Base64?

1 前言 最近在开发中遇到文件上传采用Base64的方式上传&#xff0c;记得以前刚开始学http上传文件的时候&#xff0c;都是通过content-type为multipart/form-data方式直接上传二进制文件&#xff0c;我们知道都通过网络传输最终只能传输二进制流&#xff0c;所以毫无疑问他们本…...

使用oracleVM搭建虚拟机

选择新建&#xff0c;点击 取名字&#xff0c;选择你的安装路径&#xff0c;选择你爹镜像光盘&#xff0c;再勾选下面的&#xff0c;表示跳过一些步骤 其他的都可以默认&#xff0c;下一步即可 创建好了&#xff0c;点击设置&#xff0c;改变光驱&#xff0c;硬盘的顺序 等待它…...

深入探讨C存储类和存储期——Storage Duration

&#x1f517; 《C语言趣味教程》&#x1f448; 猛戳订阅&#xff01;&#xff01;&#xff01; ​—— 热门专栏《维生素C语言》的重制版 —— &#x1f4ad; 写在前面&#xff1a;这是一套 C 语言趣味教学专栏&#xff0c;目前正在火热连载中&#xff0c;欢迎猛戳订阅&#…...

医学图像融合的深度学习方法综述

文章目录 Deep learning methods for medical image fusion: A review摘要引言非端到端的融合方法基于深度学习的决策映射基于深度学习的特征提取 端到端图像融合方法基于卷积神经网络(CNN)的图像融合方法单级特征融合方法多级特征融合基于残差神经网络的图像融合方法基于密集神…...

【Qt学习】04:QDialog

QDialog OVERVIEW QDialog一、自定义对话框1.模态对话框2.非模态对话框3.练习代码 二、标准对话框1.消息对话框2.文件对话框3.颜色对话框4.字体对话框 对话框是 GUI 程序中不可或缺的组成部分&#xff0c;对话框通常会是一个顶层窗口出现在程序最上层&#xff0c;用于实现短期任…...

如何更好的进行异常处理

背景 在实际开发中&#xff0c;我们都希望程序可以一直按照期望的流程&#xff0c;无误的走下去。但是由于不可避免的内外部因素&#xff0c;可能导致出现异常的情况&#xff0c;轻则导致报错&#xff0c;重则数据错乱、服务不可用等情况。严重影响系统的稳定性&#xff0c;甚至…...

若依微服务版部署到IDEA

1.进入若依官网&#xff0c;找到我们要下的微服务版框架 2.点击进入gitee,获取源码&#xff0c;下载到本地 3.下载到本地后&#xff0c;用Idea打开&#xff0c;点击若依官网&#xff0c;找到在线文档&#xff0c;找到微服务版本的&#xff0c;当然你不看文档&#xff0c;直接按…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...