java八股文面试[数据库]——行溢出

news2024/11/27 14:38:47
行记录格式
1) 行格式分类

表的行格式决定了它的行是如何物理存储的,这反过来又会影响查询和DML操作的性能。如果在单个page页中容纳更多行,查询和索引查找可以更快地工作,缓冲池中所需的内存更少,写入更新时所需的I/O更少。

InnoDB存储引擎支持四种行格式:Redundant、Compact、Dynamic 和 Compressed .

查询MySQL使用的行格式,默认为: dynamic

mysql> show variables like 'innodb_default_row_format';
+---------------------------+---------+
| Variable_name             | Value   |
+---------------------------+---------+
| innodb_default_row_format | dynamic |
+---------------------------+---------+

指定行格式语法

CREATE TABLE <table_name(column_name)> ROW_FORMAT=行格式名称
ALTER TABLE <table_name> ROW_FORMAT=行格式名称
2) COMPACT 行记录格式

Compact 设计目标是高效地存储数据,一个页中存放的行数据越多,其性能就越高。

Compact行记录由两部分组成: 记录放入额外信息 和 记录的真实数据.

image.png

记录额外信息部分

服务器为了描述一条记录而添加了一些额外信息(元数据信息),这些额外信息分为3类,分别是: 变长字段长度列表、NULL值列表和记录头信息.

  • 变长字段长度列表

    MySQL支持一些变长的数据类型,比如VARCHAR(M)、VARBINARY(M)、各种TEXT类型,各种BLOB类型,这些变长的数据类型占用的存储空间分为两部分:

    1. 真正的数据内容

    2. 占用的字节数

    变长字段的长度是不固定的,所以在存储数据的时候要把这些数据占用的字节数也存起来,读取数据的时候才能根据这个长度列表去读取对应长度的数据。

    Compact行格式中,把所有变长类型的列的长度都存放在记录的开头部位形成一个列表,按照列的顺序逆序存放,这个列表就是 变长字段长度列表

  • NULL值列表

    表中的某些列可能会存储NULL值,如果把这些NULL值都放到记录的真实数据中会比较浪费空间,所以Compact行格式把这些值为NULL的列存储到NULL值列表中。( 如果表中所有列都不允许为 NULL,就不存在NULL值列表 )

  • 记录头信息

    记录头信息是由固定的5个字节组成,5个字节也就是40个二进制位,不同的位代表不同的意思,这些头信息会在后面的一些功能中看到。

    名称大小(单位:bit)描述
    预留位11没有使用
    预留位21没有使用
    delete_mask1标记该记录是否被删除
    min_rec_mask1标记该记录是否是本层B+树的非叶子节点中的最小记录
    n_owned4表示当前分组中管理的记录数
    heap_no13表示当前记录在记录堆中的位置信息
    record_type3表示当前记录的类型: 0 表示普通记录, 1 表示B+树非叶子节点记录, 2 表示最小记录,3表示最大记录
    next_record16表示下一条记录的相对位置
  1. delete_mask

    这个属性标记着当前记录是否被删除,占用1个二进制位,值为0 的时候代表记录并没有被删除,为1 的时候代表记录被删除掉了

  2. min_rec_mask

    B+树的每层非叶子节点中的最小记录都会添加该标记。

  3. n_owned

    代表每个分组里,所拥有的记录的数量,一般是分组里主键最大值才有的。

  4. heap_no

    在数据页的User Records中插入的记录是一条一条紧凑的排列的,这种紧凑排列的结构又被称为堆。为了便于管理这个堆,把记录在堆中的相对位置给定一个编号——heap_no。所以heap_no这个属性表示当前记录在本页中的位置。

  5. record_type

    这个属性表示当前记录的类型,一共有4种类型的记录, 0 表示普通用户记录, 1 表示B+树非叶节点记录, 2 表示最小记录, 3 表示最大记录。

  6. next_record

    表示从当前记录的真实数据到下一条记录的真实数据的地址偏移量,可以理解为指向下一条记录地址的指针。值为正数说明下一条记录在当前记录后面,为负数说明下一条记录在当前记录的前面。

  • 记录真实数据部分

    记录的真实数据除了插入的那些列的数据,MySQL会为每个记录默认的添加一些列(也称为隐藏列),具体的列如下:

    image.png

    列名是否必须占用空间描述
    row_id6字节行ID,唯一标识一条记录
    transaction_id6字节事务ID
    roll_pointer7字节回滚指针

    生成隐藏主键列的方式有:

1. 服务器会在内存中维护一个全局变量,每当向某个包含隐藏的row_id列的表中插入一条记录时,就会把该变量的值当作新记录的row_id列的值,并且把该变量自增1。
2. 每当这个变量的值为256的倍数时,就会将该变量的值刷新到系统表空间的页号为7的页面中一个Max Row ID的属性处。
3. 当系统启动时,会将页中的Max Row ID属性加载到内存中,并将该值加上256之后赋值给全局变量,因为在上次关机时该全局变量的值可能大于页中Max Row ID属性值。
3) Compact中的行溢出机制

什么是行溢出 ?

MySQL中是以页为基本单位,进行磁盘与内存之间的数据交互的,我们知道一个页的大小是16KB,16KB = 16384字节.而一个varchar(m) 类型列最多可以存储65532个字节,一些大的数据类型比如TEXT可以存储更多.

如果一个表中存在这样的大字段,那么一个页就无法存储一条完整的记录.这时就会发生行溢出,多出的数据就会存储在另外的溢出页中.

总结: 如果某些字段信息过长,无法存储在B树节点中,这时候会被单独分配空间,此时被称为溢出页,该字段被称为页外列

Compact中的行溢出机制

InnoDB 规定一页至少存储两条记录(B+树特点),如果页中只能存放下一条记录,InnoDB存储引擎会自动将行数据存放到溢出页中. 当发生行溢出时,数据页只保存了前768字节的前缀数据,接着是20个字节的偏移量,指向行溢出页.

image.png

知识来源:马士兵教育

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

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

相关文章

如何利用TikTok营销策略,来帮你赢得用户的心?

TikTok作为一款全球热门的短视频社交应用&#xff0c;已经成为许多品牌和营销人员的首选平台之一。作为一个出海公众号博主&#xff0c;我将在下面的文章中探讨TikTok营销的重要性、策略和成功案例。 首先&#xff0c;我们来谈一谈TikTok营销的重要性。随着移动互联网的迅速发…

突然发现ONLYOFFICE支持了.wps格式系列文件了

突然发现ONLYOFFICE支持了.wps格式系列文件了 最近做慕课&#xff0c;突然发现&#xff0c;我国产金山的WPS办公软件的.wps后缀名格式文件&#xff0c;居然被ONLYOFFICE这款办公软件支持打开了&#xff0c;找到官网仔细查看更新说明才确认就是最新一次更新加入的&#xff0c;并…

LabVIEW利用人工神经网络辅助进行结冰检测

LabVIEW利用人工神经网络辅助进行结冰检测 结冰对各个领域构成重大威胁&#xff0c;包括但不限于航空航天和风力涡轮机行业。在起飞过程中&#xff0c;飞机机翼上轻微积冰会导致升力降低25%。研究报告称&#xff0c;涡轮叶片上的冰堆积可在19个月的运行时间内造成29MWh的功率损…

View体系简析

应用程序中的View框架 应用程序中的View框架如图所示。 View和ViewRoot 如果以xml文件来描述UI界面的layout&#xff0c;可以发现里面的所有元素实际上都形成了树状结构的关系&#xff0c;比如&#xff1a; <LinearLayout xmlns:android"http://schemas.android.c…

算法通关村-----快速排序的应用

数组中的第K个最大元素 问题描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。详见leetcode215 问题分析 之前我们已经使用堆排序/堆查找的…

群晖NAS:黑群cpu信息显示不正确修正

群晖NAS&#xff1a;黑群cpu信息显示不正确修正 黑群晖的面板信息&#xff0c;cpu信息一直是错误的&#xff0c;很难受&#xff0c;修正方法如下&#xff1a; 【1】下载插件&#xff1a; 打开&#xff1a; https://github.com/FOXBI/ch_cpuinfo/releases 下载&#xff1a; …

图像分割笔记(二): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程))

文章目录 一、图像分割介绍二、YOLOv5-Seg介绍三、代码获取四、视频讲解五、环境搭建六、数据集准备6.1 数据集转换6.2 数据集验证七、模型训练八、模型验证九、模型测试十、评价指标一、图像分割介绍 图像分割是指将一幅图像划分为若干个互不重叠的区域,每个区域内的像素具有…

win7打开文件夹总弹出新窗口怎么办

我们在使用电脑打开文件夹时&#xff0c;都是在同一个窗口显示&#xff0c;查看非常方便&#xff0c;如果遇到每次打开文件夹弹出新窗口就总觉得很烦人&#xff0c;下面就一起来看看解决win7文件夹每次打开新窗口的方法。 一、 使用360或相关杀毒软件查杀木马&#xff0c;完成…

Kafka3.0.0版本——文件存储机制

这里写木目录标题 一、Topic 数据的存储机制1.1、Topic 数据的存储机制的概述1.2、Topic 数据的存储机制的图解1.3、Topic 数据的存储机制的文件解释 二、Topic数据的存储位置示例 一、Topic 数据的存储机制 1.1、Topic 数据的存储机制的概述 Topic是逻辑上的概念&#xff0c…

网易互娱游戏测试岗位面试喜欢问什么?

对游戏感兴趣&#xff0c;但是计算机技能还有些许欠缺的同学们可以试下游戏测试这个岗位。下面总结了网易互娱游戏测试岗位的面经。 网易互娱的游戏测试岗位面试的主要内容包括&#xff1a;简历里的项目和实践经历&#xff0c;简单的技术问题和游戏相关的经历和技术。一定要有…

【C语言】探讨常见自定义类型的存储形式

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该文章将探讨结构体&#xff0c;位段&#xff0c;共用体的存储形式。 目录&#xff1a; &#x1f30d;结构体内存对齐✉…

MySQL的常用术语

目录 1.关系 2.元组 3.属性 MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 1.关系 前面的博客有说到,MySQL是一款关系型数据库管理软件,一个关系就是 一张二维表(表) 我想大家都知道表格怎么…

linux常用命令及解释大全(一)

目录 一、系统信息 二、关机、重启及登出 三、文件和目录 3.1 导航命令 3.2 查看命令 3.3 创建和删除命令 3.4 复制和链接命令 3.5 其他命令 四、文件搜索 五、挂载文件系统 六、磁盘空间 七、用户和群组 总结 前言 Linux 是一种自由和开放源代码的操作系统&…

编写软件检测报告有哪些注意事项?软件检测报告获取

软件检测报告是指把测试的过程和结果写成文档&#xff0c;对发现的问题和缺陷进行分析&#xff0c;为纠正软件的存在的质量问题提供依据&#xff0c;同时为软件验收和交付打下基础。 一、编写软件检测报告的注意事项 1、报告的结构要合理和清晰。应该按照一定的逻辑顺序&…

基于Java+SpringBoot+Vue前后端分离医院挂号就诊系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

重磅| Falcon 180B 正式在 Hugging Face Hub 上发布!

引言 我们很高兴地宣布由 Technology Innovation Institute (TII) 训练的开源大模型 Falcon 180B 登陆 Hugging Face&#xff01; Falcon 180B 为开源大模型树立了全新的标杆。作为当前最大的开源大模型&#xff0c;有180B 参数并且是在在 3.5 万亿 token 的 TII RefinedWeb 数…

K8S访问控制------认证(authentication )、授权(authorization )体系

一、账号分类 在K8S体系中有两种账号类型:User accounts(用户账号),即针对human user的;Service accounts(服务账号),即针对pod的。这两种账号都可以访问 API server,都需要经历认证、授权、准入控制等步骤,相关逻辑图如下所示: 二、authentication (认证) 在…

【Linux】- Linux下搭建Java环境[IDEA,JDK8,Tomcat]

Java环境 1. 安装JDK2.安装tomcat3.安装idea4. 安装MySQL5.7 1. 安装JDK /usr/local&#xff1a;存放用户自行安装的软件&#xff0c;默认情况下不会被系统软件包管理器管理 发现解压后的文件已经整体移动到/usr/local/java 文件夹下 打开bin目录&#xff0c;可以看到java的版…

c++异步框架workflow分析

简述 workflow项目地址 &#xff1a; https://github.com/sogou/workflow workflow是搜狗开源的一个开发框架。可以满足绝大多数日常服务器开发&#xff0c;性能优异&#xff0c;给上层业务提供了易于开发的接口&#xff0c;却只用了少量的代码&#xff0c;举重若轻&#xff…

​LeetCode解法汇总1123. 最深叶节点的最近公共祖先

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个有…