MySQL之 InnoDB逻辑存储结构

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

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

相关文章

Vue3中快速Diff算法

在Vue3中,快速Diff算法主要用于优化虚拟DOM的更新过程,减少不必要的DOM操作,提高性能。以下是对Vue3源码中快速Diff算法的解读: 首先,我们需要引入Vue3的相关包: import { reactive, toRefs, watch } fro…

f-string字符串格式化方法

f-string f-string是一种在Python3.6版本中引入的新的字符串格式化方法。它允许在字符串中插入变量值或表达式的计算结果,使用一种简单的、直观的语法。 f-string的格式为f"字符串 {表达式/变量}",其中大括号 {} 内可以是一个变量名、一个表…

[MTK]安卓8 ADB执行ota升级

需求 adb 推送update.zip进行安卓的OTA升级 环境 平台:mtk SDK:Android 8 命令方式 需要root adb root adb remount adb push update.zip /data/media/0/ adb shell uncrypt /data/media/0/update.zip /cache/recovery/block.map adb shell echo /data/media/0/update.zi…

智慧配电间(配电室智能监控)

智慧配电间是一种应用物联网、云计算、大数据等先进技术,对配电室进行智能化改造和升级,依托电易云-智慧电力物联网,实现电力设备的实时监控、智能控制和远程管理的解决方案。以下是智慧配电间的主要功能和特点: 实时监控与数据分…

【数组】-Lc1-两数之和

写在前面 最近想复习一下数据结构与算法相关的内容,找一些题来做一做。如有更好思路,欢迎指正。 目录 写在前面一、场景描述二、具体步骤1.环境说明2.代码 写在后面 一、场景描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找…

Python print函数的使用

Python中print函数的完整使用方法如下: print(*objects, sep , end\n, filesys.stdout, flushFalse)objects:这是print函数的主要输出内容,可以是一个或多个对象,如字符串、数字、变量等。当传入多个对象时,print函数…

特殊符号+彩色表情符号大全

特殊符号彩色表情符号大全 1、常用符号2、特殊符号3、编号序号4、数学符号5、爱心符号6、标点符号7、单位符号8、货币符号9、箭头符号(含推导&转换符号)10、符号图案11、希腊字母12、俄语字母13、汉语拼音14、中文字符15、日文符号16、制表符号17、皇…

Python与GPU编程快速入门(六)

文章目录 8、常量内存(Constant Memory)9、并发访问GPU9.1 在同一GPU上同时执行两个内核9.2 Stream同步9.3 使用流和事件测量执行时间8、常量内存(Constant Memory) 常量内存是只读缓存,其内容可以广播到块中的多个线程。 在常量内存中分配的变量需要使用特殊的__constan…

Mysql 效率优化

MySQL 是一种开源的关系型数据库管理系统,常用于 Web 应用程序的数据存储。在应用程序的开发和运维过程中,MySQL 的性能和效率往往是需要重点关注的问题。以下是一些 MySQL 的效率优化技巧: 优化 SQL 语句:合理设计 SQL 查询语句可…

中式言情短剧APP力压TikTok荣登美国下载榜一!外国人也难逃“霸总爱上我”的狗血剧?

开局退婚、豪门恩怨、霸道总裁爱上我……这些由中国团队拍摄、外国演员出演的竖屏霸总短剧,正在海外收割市场。 01 ReelShort力压TikTok冲上美国榜一 TKFFF获悉,国内数字出版企业中文在线旗下短剧App ReelShort日前力压TikTok冲上美国iOS娱乐榜第1名&…

[Matlab有限元分析] 2.杆单元有限元分析

1. 一维杆单元有限元分析程序 一维刚单元的局部坐标系(单元坐标系)与全局坐标系相同。 1.1 线性杆单元 如图所示是一个杆单元,由两个节点i和j,局部坐标系的X轴沿着杆的方向,由i节点指向j节点,每个节点有…

唯品会年度特卖大会㊙内购清单㊙

唯品会年度特卖大会㊙内购清单㊙ 内部员工亲友专享,实实在在省钱,❌抢完不补! 今晚8点开抢,提前收藏>> https://t.vip.com/Im3KlTnDSJ8 2023年唯品会年度特卖大会热门会场推荐 1.唯品会年度特卖大会 限时加码!瓜分百万津贴!抢海量…

【软件测试】白盒测试和黑盒测试

一、软件测试基本分类 一般地,我们将软件测试活动分为以下几类:黑盒测试、白盒测试、静态测试、动态测试、手动测试、自动测试等等。 黑盒测试 黑盒测试又叫功能测试、数据驱动测试或给予需求规格说明书的功能测试。这种测试注重于测试软件的功能性需…

什么是木马

木马 1. 定义2. 木马的特征3. 木马攻击流程4. 常见木马类型5. 如何防御木马 1. 定义 木马一名来源于古希腊特洛伊战争中著名的“木马计”,指可以非法控制计算机,或在他人计算机中从事秘密活动的恶意软件。 木马通过伪装成正常软件被下载到用户主机&…

【laBVIEW学习】4.声音播放,自定义图标,滚动条设置

一。声音播放(报错,未实现) 1.报错4810 2.解决方法: 暂时未解决。 二。图片修改 1.目标:灯泡---》自定义灯泡 2.步骤: 1.右键点击--》自定义运行 表示可以制作自定义类型 2.右键--》打开自定义类型 这样就…

Python streamlit指南,构建令人惊叹的可视化Web界面!

更多资料获取 📚 个人网站:ipengtao.com 在当今数据驱动的世界中,构建交互式、美观且高效的数据可视化应用变得至关重要。而Streamlit,作为Python生态系统中为开发者提供了轻松创建Web应用的利器。 本文将深入探讨Streamlit的方…

一次显著的性能提升,从8s到0.7s

前言 最近我在公司优化了一些慢查询SQL,积累了一些SQL调优的实战经验。 我之前写过一些SQL优化相关的文章《聊聊SQL优化的15个小技巧》和《explain | 索引优化的这把绝世好剑,你真的会用吗?》,在全网广受好评。 这篇文章从实战…

Oracle数据库连接,TNS描述符与连接字符串

前言:在现代应用程序开发中,与数据库建立可靠、高效的连接是至关重要的一环。在Oracle数据库中,Transparent Network Substrate(TNS)提供了一种强大的网络服务,使得客户端能够通过逻辑服务名连接到数据库&a…

Intellij IDEA 的安装和使用以及配置

IDE有很多种,常见的Eclipse、MyEclipse、Intellij IDEA、JBuilder、NetBeans等。但是这些IDE中目前比较火的是Intellij IDEA(以下简称IDEA),被众多Java程序员视为最好用的Java集成开发环境,今天的主题就是IDEA为开发工…

linux服务器防火墙知识学习

# 查看rich-rules 查看所有防火墙已注册的规则 [roothcss-ecs-8b3c ~]# firewall-cmd --list-rich-rules rule family"ipv4" source address"xxx.xxx.xx.xx" accept# 每次设定完规则相关后&#xff0c;都需要<reload>防火墙 [roothcss-ecs-8b3c ~]…