MySQL之 InnoDB逻辑存储结构

news2024/11/15 19:30:02

InnoDB逻辑存储结构

InnoDB将所有数据都存放在表空间中,表空间又由段(segment)、区(extent)、页(page)组成。InnoDB存储引擎的逻辑存储结构大致如下图。下面我们就一个个来看看。

在这里插入图片描述

页( InnoDB 磁盘管理的最小单位)

页是磁盘与内存交互和数据库IO的最小单位,也是数据库管理空间存储的基本单位

页的组织方式

数据页之间在物理存储空间上不需要连续,只需要通过一个双向链表连接,在聚簇索引中数据页内数据按照主键大小顺序组成单向链表(每一个数据页会为它里面的数据生成一个页目录,避免单向链表的遍历)

页的内部结构

文件头(描述页信息)

  • FIL_PAGE_OFFSET(页号)
  • FIL_PAGE_UNDO_LOG(事务回滚)
  • FILE_PAGE_INDEX(索引页)
  • FILE_PAGE_PRE+NEXT上一页下一页的页号
  • FILE_PAGE_SPACE_OR_CHECKSUM(当前页面校验和)
  • FILE_PAGE_LSN(页面最后被修改对应的日志序列位置)

文件尾(检验页是否完整)

校验和+LSN

页目录(存储用户记录的相对位置 )

方便我们在一个页内不用采用遍历链表的方式找到数据 提高查询效率

在这里插入图片描述

使用页目录,二分查找数据

在这里插入图片描述

页目录分组个数如何确定?
在这里插入图片描述

如何在页目录下快速查找数据

在这里插入图片描述

小结:

在一个数据页中查找指定主键值的记录分为两步:

1.通过二分法确定所在的槽,并找到槽所在分组中主键最小的那个记录

2.通过next_record属性遍历该组的各个记录

页头(页的状态信息)

在这里插入图片描述

最大记录和最小记录

两个虚拟的行记录

User Records(用户记录:存储行记录信息)

按照指定的行格式摆在user record部分,相互形成单链表

Free Space(空闲空间)

我们自己存储的记录会按照指定的行格式存储到User Records中 ,但在一开始并没有User Records这个部分,当我们每插入一条数据就从Free Space申请一个记录大小的空间到User Records部分来存储这条记录,当Free Space的空间被用完后就意味着这个页的空间已经满了,需要申请新的页

行格式

格式:ROW_FORMAT=行格式名称

种类:

COMPACT:

在这里插入图片描述

变长字段长度列表

varchar 类型是变长的,例如 varchar(50),那么这个字段值的长度范围:0 ~ 50 个字符。但是,不是每个字段值都刚好50个字符,肯定会有的长有的短。

那么,数据存储时,会按照字段定义时的最大长度来存储值吗?

必须不会的,如果都按照最大长度存储,当出现值不满 50个字符长度时,会浪费磁盘空间和内存空间。

为什么也浪费内存空间,数据不是存放在磁盘么?大家不会忘了缓冲池的作用了吧?哈哈,要记得缓冲池和磁盘数据交换的单位就是数据页而数据行是存放在数据页中的

InnoDB 中,利用 变长字段长度列表 来解决上面的问题:

  1. 变长字段长度列表记录每一个变长字段值的长度,存储的长度是十六进制的。
  2. 如果有多个变长字段,那么变长字段长度列表是按逆序存储的。

NULL值列表

记录null值是为了不浪费空间,方便辨别为空字段,如果可以为空字段为空则直接跳过

记录头信息

在这里插入图片描述

delete_mask

值为0:该记录还没有删除 值为1:该记录已经删除

被删除的记录为什么还在页中存储呢?

因为立即在磁盘上移除该记录会导致其他记录进行重新排列,导致性能消耗。将不需要的记录打上标记,这些删除记录会组成链表,这些垃圾链表中占用的空间变为可重用空间,之后有记录插入时可以直接覆盖垃圾链表中的记录

记录的真实数据

记录的真实数据除了我们的定义的列的数据外还有三个隐藏列

在这里插入图片描述

  1. DB_ROW_ID 字段:如果我们没有指定主键和unique key唯一索引的时候,他就内部自动加一个ROW_ID作为主键。
  2. DB_TRX_ID 字段:事务 ID,标识这是哪个事务更新的数据
  3. DB_ROLL_PTR 字段:回滚指针,用来进行事务回滚的

行溢出问题

数据页的默认大小是 16kb,但是某些字段的值可以远远大于 16kb。

例如变长字段类型 varchar(N):N 最大可为 65532(65kb),这就远远大于 16kb。

当然了,还有 text 和 blog 字段,这些都是大字段,都可以超过 16kb。

如果一行数据的大小超过了 16kb,就会出现行溢出的现象。

怎么解决?

当一行数据超了 16kb,会在超了大小的那个字段中,可能仅仅包含他的一部分数据,然后同时包含一个20个字节的指针,指向存储了这行数据超了的部分的其他数据页。

DYNAMIC和COMPARESSED

Redundant

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

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

相关文章

【Qt绘图】之绘制坦克

使用绘图事件&#xff0c;绘制坦克。 效果 效果很逼真&#xff0c;想象力&#xff0c;有没有。 示例 代码像诗一样优雅&#xff0c;有没有。 包含头文件 #include <QApplication> #include <QWidget> #include <QPainter>绘制坦克类 class TankWidge…

机器人RL数据集探索

机器人RL数据集探索 相关资料汇总 相关资料汇总

hutool的bug之 DateUtil.endOfDay(DateUtil.date())

hutool 工具类DateUtil 使用时谨慎 DateUtil.endOfDay 得到的时间保存到数据时会增加一秒 首先比较下时间的long值&#xff1a; 这样就很明显的看出来&#xff0c;hutool工具类的date是毫秒位多了.999,保存到mysql 的时候&#xff0c;MySQL数据库对于毫秒大于500的数据进行…

SPI学习

SPI介绍 SPI&#xff1a;串行外设设备接口&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步通信总线。 全双工&#xff1a;同一时刻&#xff0c;能同时接收数据和发送数据。 半双工&#xff1a;同一时刻&am…

树与二叉树堆:经典OJ题集

目录 查找值为x的结点&#xff1a; 思路分析&#xff1a; 单值二叉树&#xff1a; 示例&#xff1a; 思路分析&#xff1a; 相同的树&#xff1a; 示例&#xff1a; 思路分析&#xff1a; 二叉树的前序遍历&#xff1a;——使用前序遍历把结点元素放入数组中 题…

二分算法(整数二分、浮点数二分)

文章目录 二分一、整数二分&#xff08;一&#xff09;整数二分思路&#xff08;二&#xff09;整数二分算法模板1.左查找&#xff08;寻找左侧边界&#xff09;2.右查找&#xff08;寻找右侧边界&#xff09;3.总模板 &#xff08;三&#xff09;题目&#xff1a;数的范围 二、…

算法通关村第五关—Hash基础知识(青铜)

Hash基础 一、Hash的概念和基本特征 哈希(Hash)也称为散列&#xff0c;就是把任意长度的输入&#xff0c;通过散列算法&#xff0c;变换成固定长度的输出&#xff0c;这个输出值就是散列值。很多人可能想不明白&#xff0c;这里的映射到底是啥意思&#xff0c;为啥访问的时间…

【brpc学习实践】ParallelChannel的使用与并行请求

概览 ParallelChannel (有时被称为“pchan”)同时访问其包含的sub channel,并合并它们的结果。用户可通过CallMapper修改请求,通过ResponseMerger合并结果。ParallelChannel看起来就像是一个Channel: 支持同步和异步访问。 发起异步操作后可以立刻删除。 可以取消。 支持超…

Vue生命周期:组件的生命之旅

&#x1f343;引言 在Vue.js中&#xff0c;每个组件都有其独特的生命周期。这个生命周期指的是组件从创建到销毁的一系列过程。了解并正确使用Vue的生命周期钩子&#xff0c;对于优化组件性能、管理组件状态以及实现特定功能至关重要。本文将详细介绍Vue的生命周期及其各个阶段…

mysql mybatis分页查询 大数据量 非常慢

查阅了很多博客和资料&#xff0c;这篇文章以思路为准&#xff0c;详细代码不细说&#xff0c;都是非常简单的方法&#xff0c;一看就明白。具体实现稍微百度一下就能出来。仅供参考。 如题&#xff1a;单表数据已经达到4千万条数据&#xff0c;通过mybatis的分页查询效率非常低…

如何提高销售技巧,增加客户的成交率?

如何提高销售技巧&#xff0c;增加客户的成交率&#xff1f; 在如今的市场环境中&#xff0c;销售技巧的高低往往决定了你是否能够成功地打动客户的心。想要提高销售业绩&#xff0c;除了产品质量和服务的保障&#xff0c;更需要你精进销售技巧&#xff0c;从而让客户愿意为你…

一种快速设计射频功放IC流程分享

No.1设计目标 在功率放大器PA中&#xff0c;输出级以及输出匹配决定了该功放的线性度、效率等关键性能指标&#xff0c;通常被优先考虑。在这个项目中输出级功放关键性能指标如下&#xff1a; 带宽&#xff1a;12-13 GHz OP1dB>13dBm 输出级 Power gain>5dB DE_P1dB&…

TCP解帧解码、并发送有效数据到FPGA

TCP解帧解码、并发送有效数据到FPGA 工程的功能&#xff1a;使用TCP协议接收到网络调试助手发来的指令&#xff0c;将指令进行解帧&#xff0c;提取出帧头、有限数据、帧尾&#xff1b;再将有效数据发送到FPGA端的BRAM上&#xff0c;实现信息传递。 参考&#xff1a;正点原子启…

基于springboot实现的在线考试系统

一、系统架构 前端&#xff1a;html | js | css | jquery | bootstrap 后端&#xff1a;springboot | springdata-jpa 环境&#xff1a;jdk1.7 | mysql | maven 二、 代码及数据库 三、功能介绍 01. 登录页 02. 管理员端-课程管理 03. 管理员端-班级管理 04. 管理员端-老师管理…

【CAN通信】CanIf模块详细介绍

目录 1.内容简介 2.CanIf详细设计 2.1 CanIf功能简介 2.2 一些关键概念 2.3依赖的上下层模块 2.4 功能详细设计 2.4.1 Hardware object handles 2.4.2 Static L-PDUs 2.4.3 Dynamic L-PDUs 2.4.4 Dynamic Transmit L-PDUs 2.4.5 Dynamic receive L-PDUs 2.4.6Physi…

微信小程序 - 开发版、体验版、正式版共享本地缓存

问题描述 最近突然发现一个大问题啊&#xff0c;小程序切换版本环境的时候发现数据被污染了&#xff0c;瞬间就怀疑不同环境版本的小程序本地缓存是否共享的&#xff1f;&#xff01; 果然是&#xff01; 解决方案 我们可能马上想到解决方案就是&#xff1a;给每一个环境版本…

不想花钱用aspera?这些免费的替代方案也同样快速哦

Aspera FASP是一款高速数据传输软件&#xff0c;被广泛应用于大文件的快速传输。然而&#xff0c;Aspera FASP并不便宜&#xff0c;对于一些小型企业或个人用户来说可能无法负担。因此&#xff0c;为了满足大家的需求&#xff0c;本文将介绍一些免费且同样快速的Aspera替代方案…

【meta】Scaling Speech Technology to 1,000+ Languages

nvidia-NeMo包含TTS的模型&#xff0c;开源数据 uroma转写工具介绍 uroman转写工具 N-to-M mapping 转写的规范&#xff0c;包含一些中文-拼音&#xff0c;拉丁文-读法的规则转换。字符串匹配规则下的查字典&#xff1b; 将字母对应到发音单元 转写规范 转写过程尽量做到可…

Android Studio初学者实例:Fragment学习--仿美团外卖界面

本次课程为Fragment为主题&#xff0c;课程的示例仿美团外卖界面&#xff0c;不同于底部导航栏的Fragment案例&#xff0c;此界面分为左侧切换与顶部切换。本文先是发布代码与效果&#xff0c;后续讲解将会在后续补充。先看看效果&#xff1a; 首先是布局文件代码&#xff1a;A…

GPT带我学Openpyxl操作Excel

注&#xff1a;以下文字大部分文字和代码由GPT生成 一、openpyxl详细介绍 Openpyxl是一个用于读取和编写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它允许您使用Python操作Excel文件&#xff0c;包括创建新的工作簿、读取和修改现有工作簿中的数据、设置单元格格式以及编…