12.InnoDB记录结构

news2024/11/19 14:47:04

title: “InnoDB记录结构”
createTime: 2022-03-06T15:52:41+08:00
updateTime: 2022-03-06T15:52:41+08:00
draft: false
author: “ggball”
tags: [“mysql”]
categories: [“db”]
description: “”

InnoDB记录结构

innoDB存储引擎介绍

存储引擎的作用就是内存和磁盘打交道,负责将数据在他两之间传输,为了提高传输效率,提出了“页”的概念,也就是在一般情况下,为了减少io次数,一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。

页:将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KB。

innoDB行格式

行格式:记录在磁盘上的存放方式称为行格式。

四种行格式:Compact 、 Redundant 、Dynamic 和 Compressed 行格式。

指定行格式命令

REATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称 
ALTER TABLE 表名 ROW_FORMAT=行格式名称


mysql> CREATE TABLE record_format_demo ( 
   ->     c1 VARCHAR(10), 
   ->     c2 VARCHAR(10) NOT NULL, 
   ->     c3 CHAR(10), 
   ->     c4 VARCHAR(10) 
   -> ) CHARSET=ascii ROW_FORMAT=COMPACT; 
Query OK, 0 rows affected (0.03 sec)

介绍InnoDB的Compact行格式

可以把记录分为记录额外信息,记录真实数据

image-20220211144936545

记录额外信息
  1. 边长字段长度列表:记录可变长度字段的真实数据占用的字节数

    注意:变长字段长度列表中只存储值为 非NULL 的列内容占用的长度,值为 NULL 的列的长度是不储存的

  2. null值列表:值为 NULL 的列统一管理起来,存储到 NULL 值列表中

  3. 记录头信息:固定的 5 个字节组成,存放记录的描述信息

记录头信息

记录头信息

真实数据

除了存放真实数据外,还会添加隐藏列,具体如下:

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

注意:实际上这几个列的真正名称其实是:DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR,我们为了美观才写成了row_id、transaction_id和roll_pointer。

char(M)的存储格式

对于 CHAR(M) 类型的列来说,当列采用的是定长字符集时,该列占用的字节数不会被加到变长字段长度列表,而如果采用变长字符集时,该列占用的字节数也会被加到变长字段长度列表

表的行格式采用compact实验
create table record_test_1 (
	id bigint,
	score double,
	name char(4),
	content varchar(8),
	extra varchar(16)
)row_format=compact;

INSERT INTO `record_test_1`(`id`, `score`, `name`, `content`, `extra`) VALUES (1, 78.5, 'hash', 'wodetian', 'nidetiantadetian');
INSERT INTO `record_test_1`(`id`, `score`, `name`, `content`, `extra`) VALUES (65536, 17983.9812, 'zhx', 'shin', 'nosuke');
INSERT INTO `record_test_1`(`id`, `score`, `name`, `content`, `extra`) VALUES (NULL, -669.996, 'aa', NULL, NULL);
INSERT INTO `record_test_1`(`id`, `score`, `name`, `content`, `extra`) VALUES (2048, NULL, NULL, 'c', 'jun');

目前表结构

+-------+------------+------+----------+------------------+
| id    | score      | name | content  | extra            |
+-------+------------+------+----------+------------------+
|     1 |       78.5 | hash | wodetian | nidetiantadetian |
| 65536 | 17983.9812 | zhx  | shin     | nosuke           |
| NULL  |   -669.996 | aa   | NULL     | NULL             |
|  2048 | NULL       | NULL | c        | jun              |
+-------+------------+------+----------+------------------+

windows下 到C:\ProgramData\MySQL\MySQL Server 5.7\Data\test下找到文件record_test_1.ibd,使用notepad++ 16进制打开(在notepad++找到插件->HEX-editor-> view in HEX,如果没有就安装一个)

image-20220212152338394

我们先来看第一条记录的content,extra字段,字段长度分别为8和16,字符类型都是可变的,所以这两个字段是会被存放在变长字段长度列表,

又因为存放时的顺序是逆序的,所以应该是 10 08

image-20220212152910001

Redundant行格式

没太理解,暂不记录

##行溢出数据

VARCHAR(M)最多能存储的数据

存储一个 VARCHAR(M) 类型的列,其实需要占用3部分存储空间:

  1. 真实数据
  2. 真实数据占用字节的长度
  3. NULL 值标识,如果该列有 NOT NULL 属性则可以没有这部分存储空间

首先前提是VARCHAR(M) 类型的列最多可以占用 65535 个字节!

现在假设列的字符集是ascii 字符集(一个字符代表一个字节),表只有一个列

  1. 如果列有not null则不需要花一个字节空间存null值,真实数据的长度可能占用2个字节,即可以最大有65533个字节来存储真实数据,则可以存65533个字符
  2. 如果列没有not null则需要花一个字节空间存null值,且真实数据的长度可能占用2个字节,即可以最大有65532个字节来存储真实数据,则可以存65532个字符

但是,如果字符集不是ascii 字符集呢?是utf8呢?gbk呢?

其实前面算的最大字节数是不用变得,因为字符集的改变,一个字符最大占用字节数量变了。

比如字符集是utf8的话,一个字符最大使用3个字节,所以上面的②情况,最大存储字符数65532/3=21844

上述所言在列的值允许为NULL的情况下,gbk字符集下M的最大取值就是32766,utf8字符集下M的最大取值就是21844,这都是在表中只有一个字段的情况下说的,一定要记住一个行中的所有列(不包括隐藏列和记录头信息)占用的字节长度加起来不能超过65535个字节!

记录中的数据太多产生的溢出

在 Compact 和 Reduntant 行格式中,对于占用存储空间非常大的列,在 记录的真实数据 处只会存储该列的一部分数据,把剩余的数据分散存储在几个其他的页中,然后 记录的真实数据 处用20个字节存储指向这些页的地址(当然这20个字节中还包括这些分散在其他页面中的数据的占用的字节数),从而可以找到剩余数据所在的页,
如图所示:

image-20220212172118535

最后需要注意的是,不只是 VARCHAR(M) 类型的列,其他的 TEXT、BLOB 类型的列在存储数据非常多的时候也会发生 行溢出

行溢出的临界点

假设一个列中存储的数据字节数为n,那么发生 行溢出 现象时需要满足这个式子:

136 + 2×(27 + n) > 16384
n > 8098
解释:136byte一页的额外信息+一行记录(27byte的记录额外信息+nbyte真实数据)*2 > 16384byte一页最大存储字节数

注释:

136:每个页除了存放我们的记录以外,也需要存储一些额外的信息,乱七八糟的额外信息加起来需要 136 个字节的空间(现在只要知道这个数字就好了),其他的空间都可以被用来存储记录。

2:一个页中至少存放两行记录。

27:每个记录需要的额外信息是 27 字节。

16384: 一页16kb = 16384byte

但这只是假设一个表只有一个列的情况,有多个列的话计算公式和结果都要修改

结论:你不用关注这个临界点是什么,只要知道如果我们想一个行中存储了很大的数据时,可能发生 行溢出 的现象。

Dynamic和Compressed行格式

Dynamic格式

MySQL 版本是 5.7 ,它的默认行格式就是 Dynamic ,这俩行格式和 Compact 行格式挺像,只不过在处理 行溢出 数据时有点儿分歧,它们不会在记
录的真实数据处存储字段真实数据的前 768 个字节,而是把所有的字节都存储到其他页面中,只在记录的真实数据处存储其他页面的地址,就像这样:

image-20220212172012071

Compressed行格式

Compressed 行格式和 Dynamic 不同的一点是, Compressed 行格式会采用压缩算法对页面进行压缩,以节省空间。

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

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

相关文章

python随手小练2

题目: 今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,为何? (即:一个数除3余2,除5余3,除7余2) 具体操作: xint(input(&quo…

AI编写文案工具哪些好用且免费

什么是AI编写文案工具?AI编写文案工具基于自然语言处理技术的应用程序,它们旨在协助用户创建各种类型的文案,从广告、营销材料到新闻稿和博客文章,都可以得心应手。这种技术的崛起源于对写作效率和质量的不断追求。 AI编写文案工具…

做销售管理分析需要看哪些关键指标?

做销售管理分析需要看哪些关键指标? 销售管理分析时抓取关键指标,有着能够【分析和判断销售趋势、为销售决策提供数据支持、优化销售流程和客户管理】等的好处 在了解了分析关键指标的目的之后,我们就可以根据企业的需求来确定关键指标&…

淘宝/天猫获得店铺的所有商品 API 返回值说明

淘宝API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范。 通过开放接口,开发者可以不改变现有系统,直接在原有系统上实现新功能。 在开发过程中,使用淘宝API接口可以帮助开发者快速搭建自己的应用,实…

2023年Java毕业设计题目如何选题?Java毕业设计选题大全

大家好,我是程序员徐师兄,最近有很多同学咨询,说毕业设计了,不知道选怎么题目好,有哪些是想需要注意的。 确实毕设选题实际上对很多同学来说一个大坑, 每年挖坑给自己跳的人太多太多。选到合适的题目的话&…

Linux字符设备驱动开发

文章目录 字符设备简单介绍file_operations结构体驱动编译为模块字符设备注册与注销设备的操作函数初始化添加LICENSE和作者信息设备号的分配文件操作函数字符设备驱动示例源文件chrdev.cMakefile文件测试代码app.c编译开发板上验证 字符设备简单介绍 字符设备是Linux驱动中最…

Lua函数

--函数--无参无返回值 function F1()print("F1函数") end F1() print("*****************")--有参 function F2(a)print("F2函数"..a) end F2(2) --如果传入参数和函数数量不一致 --不会报错只是补空 F2(1,2) print("*****************&quo…

iOS应用程序的签名、重签名和安装测试

目录 前言 打开要处理的IPA文件 设置签名使用的证书和描述文件 开始ios ipa重签名 前言 ipa编译出来后,或者ipa进行修改后,需要进行重新签名才能安装到测试手机,或者提交app store供apple 商店审核上架。ipaguard有签名和重签名功能&…

9.21广读最新arxiv论文 思路学习汇总

Towards Generative Modeling of Urban Flow through Knowledge-enhanced Denoising Diffusion 摘要:尽管生成式人工智能在许多领域取得了成功,但在建模地理空间数据方面的潜力仍尚未充分发掘。城市流动,是一种典型的地理空间数据&#xff0c…

单列集合顶层接口Collection

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 集合体系结构 一、单列集合顶层接口Collect…

机器学习小白理解之一元线性回归

关于机器学习,百度上一搜一大摞,总之各有各的优劣,有的非常专业,有的看的似懂非懂。我作为一名机器学习的门外汉,为了看懂这些公式和名词真的花了不少时间,还因此去着重学了高数。 不过如果不去看公式&…

软件推荐:wiztree

简要介绍 近期C盘占满,找到了这款优秀的软件wiztree。 wiztree称得上最快的磁盘空间分析器,界面简洁明晰,操作简单快捷,无广告。 下载地址:https://www.diskanalyzer.com/download 软件截图

Opencv cuda版本在ubuntu22.04中安装办法,解决Could NOT find CUDNN的办法

文章目录 概要下载cuda的runfile版本配置环境变量官网下载cudann安装Opencv依赖包下载opencv和opencv_contrib并解压准备编译安装anaconda环境执行编译命令安装OpenCV并检查是否安装成功 概要 解决以下安装问题: -- Could NOT find CUDNN: Found unsuitable versi…

OpenCascade绘制贝塞尔曲线

贝塞尔曲线有着很多特殊的性质, 在图形设计和路径规划中应用都非常广泛。 贝塞尔曲线完全由其控制点决定其形状, n个控制点对应着n-1阶的贝塞尔曲线,并且可以通过递归的方式来绘制。 一阶: 二阶: 高阶: …

雷士、书客、小米的护眼台灯谁的性价比最高?三款护眼台灯真实测评

护眼台灯怎么选一直是许多家长为孩子选台灯时的一个大难题,主要因为市场上的台灯种类太多,而且这些产品中混杂了许多不专业品牌,甚至包括许多劣质台灯和网红品牌!同时也经常能够看到报道很多“抽检不合格”的情况发生,…

S08-如何冻结表格行与列

通常表格第一行或第一列的数据都是数据归类的标题 所以比较常用到的是冻结首行首列 具体操作是点击菜单栏的“开始”-“冻结窗格”“冻结首行”

图像语义分割 FCN图像分割网络网络详解

图像语义分割 FCN图像分割网络网络详解 0、介绍1、VGG16网络结构2、转置卷积3、FCN-32S、FCN-16S,FCN-8S网络结构4、损失函数5、膨胀卷积6、FCN(Backbone-ResNet-50)6.1 项目框架6.2 ResNet50网络结构6.3 FCN(Backbone-ResNet-50)网络结构6.4 FCN(Backbone-ResNet-5…

关于接口测试——自动化框架的设计与实现

一、自动化测试框架 在大部分测试人员眼中只要沾上“框架”,就感觉非常神秘,非常遥远。大家之所以觉得复杂,是因为落地运用起来很复杂;每个公司,每个业务及产品线的业务流程都不一样,所以就导致了“自动化…

LVS和keepalived

Keepalived及其工作原理 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。 在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器&#x…

怎么自制gif动画?简单一招快速搞定

众所周知gif动图的画面非常的丰富生动,并且体积小传播方便,在当下的网络中是非常的受欢迎。那么,这种gif格式的图片是怎么制作的呢?下面,给大家分享一款专业的gif动态图片制作(https://www.gif.cn/&#xf…