【MySQL进阶之路 | 高级篇】InnoDB搜索引擎行格式

news2024/11/28 4:51:36

1. COMPACT行格式

COMPACT行格式是MySQL5.1的默认行格式.其结构示意图如下.

f1d1fc7c0c0643c0803d555be1e43332.png

大体可以分为两部分.

  • 记录的额外信息.这里面有包括变长字段长度列表,NULL值列表和记录头信息.
  • 记录的真实数据.

(1).变长字段长度列表

MySQL支持一些变长的数据类型.比如VARCHAR(m), VARBINARY(n), TEXT类型.这些数据类型修饰的列称为变长字段.变长字段中存储多少字节的数据不是固定的,所以我们在存储数据的时候也顺便把这些数据占用的字节数也存储起来.在COMPACT行格式中,把所有变长字段的真实数据占用的字节数都存放在记录的开头部位,从而形成变长字段长度列表.

这里存储的变长字段长度和字段顺序是反过来的.比如此处应该存放为060408.

CREATE TABLE compact_demo(
c1 VARCHAR(8),
c2 VARCHAR(8),
c3 CHAR(8),
c4 VARCHAR(8)
) charset=ascii ROW_FORMAT=COMPACT;

INSERT INTO compact_demo
VALUES('zhangsan', 'lisi', 'wang5', 'ding1');

b23c63c65b0f4892947bd4d16e8b8b1a.png

(2). NULL值列表

compact格式会把可以为null值的列统一管理起来,存放在一个标记为null值的列表中.如果表中没有允许存储null值的列,则null值列表也就不存在了.

之所以要存储null值,是因为数据是需要对齐的.如果没有表明出来null值的位置,就有可能查询数据的时候发生混乱.如果使用一个特定的符号放到相应数据位表示null值的话,会很浪费空间,所以干脆直接在行数据开头开辟一处空间专门用来记录该行记录哪些是空数据,哪些是非空.

二进制位为1时,该列的值为null.为0时则该列的值为非空.

如果某字段明确了是非空的(比如NOT NULL/PRIMARY KEY),那么null值列表就不管这些字段了.

(3).记录头信息

记录头信息占有5个字节大小.用于描述记录的一些属性.

147c91ca8c9947a3a951edfc4e3fc39f.png

1. 删除标记位(Delete Flag):占1位,表示记录是否被标记为删除。在InnoDB中,记录被删除时并不是立即物理删除,而是通过设置这个标志位来标记记录为已删除,这样可以快速“删除”记录且不影响后续的插入操作。

2. 最小记录标记位(Min Record Marker):占1位,仅在页内最小记录上设置为1,表明这是页内用户记录中的最小记录。

3. 最大记录标记位(Max Record Marker):占1位,仅在页内最大记录上设置为1,表明这是页内用户记录中的最大记录。

4. heap_no:占4位,表示记录在页内的堆编号,用于标识记录在页中插入的顺序。

5. next_record:占16位或24位(取决于行格式),记录指向下一个记录的指针,用于遍历页内的记录链表。在Compact和Redundant行格式中通常是16位,在DYNAMIC和COMPRESSED行格式中可能使用24位以适应更大的页大小。

6. n_owned:占4位,在B+树的非叶节点中,表示子页的数量;在聚集索引的叶节点中,表示指向同一行的辅助索引记录数量。

7. record type:占3位,表示记录类型,常见的有:
   - 0:普通用户记录。
   - 1:目录项记录,用于B+树的内部节点。
   - 2:最小记录(Infimum)
   - 3: 最大记录(Supremum),这两个特殊的记录用来界定用户记录的边界,不存储实际用户数据。

这些字段的作用以后细谈.

(4). 记录的真实数据

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

b51d6aeed5c54f9e81198bec49187a71.png

这些列的真实名称其实是 : DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR.

值得注意的是,除了第一个row_id,其他两个都是必须的.这是为什么呢?

原因我们讲过,创建聚簇索引时,我们优先选择用户自定义的主键作为主键,如果无,则会选择一个非空且唯一键作为主键,如果无,那么InnoDB会为表默认添加一个名为row_id的列作为隐藏列作为主键.

2. DYNAMIC/COMPRESSED行格式

MySQL5.7和8.0默认的行格式都是dynamic.

这两个行格式只有在行溢出这种情况下,有所区别,简单介绍一下行格式.

我们知道一个页的大小一般是16kb.也就是16384字节.而一个类型为varchar(m)的列最多可以存储65533个字节.这样就可能出现了一个页存放不下一条记录.这种情况叫行溢出.

  • 在COMPACT/REDUNTANT行格式中,对于占用存储空间非常大的列,在记录的真实数据处只会存储该列的一部分数据,把其他剩余数据分散存储在几个其他的页中进行分页存储.然后记录的真实数据用20个字节存储指向这些页的地址.从而可以找到剩余数据所在的页.
  • 在DYNAMIC/COMPRESSED行格式中,对于存放在blog中的数据采用了完全行溢出的方式.比如在数据页中只存放20个字节的地址,实际数据都放在溢出页中.

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

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

相关文章

【SCAU数据挖掘】数据挖掘期末总复习题库应用题及解析

1. 给定圆的半径为e ,令 MinPts3,考虑下面两幅图。 (1)哪些对象是核心对象? m,p,o,r(因为这些核心对象在半径e的范围内都至少包含MinPts3个对象) (2)哪些对象是直接密度可达的? 对象q是…

node: /lib64/libm.so.6: version `GLIBC_2.27‘ not found (required by node)

node: /lib64/libm.so.6: version GLIBC_2.27‘ not found 错误信息解决方案操作步骤:1、下载node版本2、上传服务器3、解压4、将文件名改短5、脚本新增6、重新加载环境变量source /etc/profile7、配置阿里云镜像仓库8、服务器打包完成 错误信息 这个错误信息表示…

论文解读:Pandora: 朝着结合自然语言动作与视频状态的通用世界模型发展

论文《Pandora: 朝着结合自然语言动作与视频状态的通用世界模型发展》探索了构建一个高度集成的AI系统,旨在理解自然语言指令并在视频所代表的视觉环境中执行相应操作,从而推进对复杂动态场景的建模与预测能力。以下是该论文的关键点和贡献的详细解读&am…

聊聊JSON

引言 JSON的概念 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,但独立于语言,这意味着它可以被许多编程语言轻松解析。JSON的简洁性和易读性使其成为Web开发中数据交换的…

煤矿智能巡检机器人:推动煤矿行业变革的关键力量

目前我国煤炭资源总量达到了2078.85亿吨,已探明储量为1432亿吨,煤矿能源现阶段还是我国重要的基础能源。而煤矿生产作业存在巨大危险,主要包括高温、高压、燃爆和有毒气体等环境因素,同时机械设备运转过程中潜藏着重大风险。这些危…

MySQL 核心模块揭秘 | 21 期 | 行锁 (1) 快速加锁

行锁有两种加锁逻辑,这一期我们聊聊其中之一的快速加锁。 作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。 爱可生开源社区出品,原创内容未经授权不得随意使用&a…

【深海王国】小学生都能做的APP?AppInventor、BLE蓝牙、Arduino联合开发你的第一个手机远程控制程序(7)

Hi~ (o^^o)♪, 各位深海王国的同志们,早上下午晚上凌晨好呀~ 辛勤工作的你今天也辛苦啦(/≧ω) 今天大都督依旧为大家带来小学生都能学会的APP制作教程,帮你一周内快速开发一款可以和单片机无线通讯的手机蓝牙APP,let’s go! &a…

Python13 时间格式转换

在Python中,时间格式转换通常指的是将日期和时间数据从一种表示形式转换成另一种。这种转换经常使用Python的datetime和time模块来实现。这些模块提供了多种工具,可以帮助用户将时间表示为字符串、时间戳,或是更加结构化的datetime对象等多种…

Android-Framework:Handler全解析,看完这篇还不懂请给我寄刀片

//【1】拿到队列头部 Message p mMessages; boolean needWake; //【2】如果消息不需要延时&#xff0c;或者消息的执行时间比头部消息早&#xff0c;插到队列头部 if (p null || when 0 || when < p.when) { // New head, wake up the event queue if blocked. msg.next…

下班时间如何安排?

随着互联网的飞速发展和数字化时代的来临&#xff0c;越来越多的人开始探索除了主业以外的赚钱途径&#xff0c;以增加收入来源。本文将为您介绍几种当前热门的高薪副业项目&#xff0c;包括网络任务赚钱、开设个人网店、电商导购推广、在线辅导教学、技能变现服务、视频创作分…

探索C嘎嘎的奇妙世界:第十六关---STL(vector的练习)

1.只出现一次的数字 我们可以使用异或运算来解决这个问题&#xff1a; 异或运算有一个重要的性质&#xff1a;两个相同的数进行异或运算结果为 0&#xff0c;任何数与 0 异或结果为其本身。对于数组中的元素&#xff0c;依次进行异或运算&#xff0c;出现两次的元素异…

任务调度框架革新:TASKCTL在Docker环境中的高级应用

Docker&#xff1a;轻量级容器化技术的魅力 Docker 作为一款开源的轻量级容器化技术&#xff0c;近年来在 IT 界掀起了一股热潮。它通过封装应用及其运行环境&#xff0c;使得开发者可以快速构建、部署和运行应用。Docker 的优势在于其轻量级、可移植性和可扩展性&#xff0c;它…

店员顾客起纠纷?EasyCVR+AI视频监控管理平台,助力连锁门店安全运营

近日&#xff0c;某品牌咖啡店店员与顾客起冲突登上了新闻热搜&#xff0c;一时间引发大量关注。随着门店完整的监控视频录像公开&#xff0c;大家才了解事情的原委&#xff0c;而并非网传的那样。 随着社会的进步和科技的发展&#xff0c;视频监控已成为各行各业不可或缺的安全…

教你开发一个适合外贸的消息群发工具!

在全球化日益加速的今天&#xff0c;外贸业务已经成为许多企业不可或缺的一部分&#xff0c;而在外贸业务中&#xff0c;高效的消息群发工具则扮演着至关重要的角色。 它能够帮助企业快速、准确地传达产品信息、促销活动等重要内容&#xff0c;从而提升业务效率和客户满意度&a…

vben admin BasicTable表格基本使用

vben admin是一款强大的后台管理系统&#xff0c;广泛应用于各种项目中。本文将为您详细介绍如何使用 便您更快地上手并充分发挥其功能。 Table 表格 | Vben Admin一个开箱即用的前端框架https://jeesite.com/front/vben-admin/docs/components/table.html#usage 1.register:…

用类来实现输入和输出时间(时:分:秒)

编写程序&#xff1a; 运行结果&#xff1a; 程序分析&#xff1a; 这是一个很简单的例子。类Time中只有数据成员&#xff0c;而且它们被定义为公用的&#xff0c;因此可以在类的外面对这些成员进行操作。t1被定义为Time类的对象。在主函数中向t1对象的数据成员输入用户…

【ai】tx2-nx:Yolo V4 直接安装与 测试

Yolo V4环境搭建 git clone https://github.com/AlexeyAB/darknet.gitcuda版本和路径也要改成我们的实际版本和路径,否则会编译失败 编译 sudo make nvidia@tx2-nx:~/twork/02_yolov4/darknet$ vi Makefile nvidia@tx2-nx:~/twork/02_yolov4/darknet$ sudo make [sudo

从起心动念上,做个好人,好人好自己(阳明心学)

人心中的天理终究不会泯灭&#xff0c;每个人心中本来就有良知&#xff0c;良知是与生俱来的。 起心动念决定了意识、语言和行为&#xff0c;而这些意识、语言和行为又决定了事事物物&#xff0c;事事物物连接起来就是我们的人生。 让自己不断产生更好的念头&#xff0c;坚持…

拿下PostgreSQL中级认证PCP,现在它是我简历上的亮点了!

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

小红书点赞评论收藏【更新版本】

小红书作为社交媒体的一个亮点&#xff0c;其点赞、评论和收藏的功能形成了一种特有的交流机制。点赞简直就是一枚迷你奖章&#xff0c;为创作者带去信心与动力。一次点赞&#xff0c;表达的是你心中无言的喜好和认可&#xff1b;它如明亮的灯塔&#xff0c;在汪洋大海中为创作…