InnoDB - 行格式

news2024/11/28 1:47:21

文章目录

  • InnoDB - 行格式
    • 1. 什么是行格式
    • 2. 四种行格式
    • 3. Compact行格式

InnoDB - 行格式

1. 什么是行格式

我们平时是以行记录为单位向表中插入数据的,这些数据在磁盘上的存放方式被称为行格式或者记录格式。

InnoDB引擎中支持四种行格式:Compact、Redundant、Dynamic、Compressed

可以在创建表的时候指定行格式,或者直接使用alter命令更改表的行格式。

  1. 创建表的时候指定行格式

    CREATE TABLE 表名 (    
    
    ) row_format = 行格式名称;
    
  2. 更改表的时候指定行格式

    ALTER TABLE 表名 ROW_FORMAT = 行格式名称;
    

2. 四种行格式

如上所述:Compact、Redundant、Dynamic、Compressed

行格式给我们的数据添加了很多额外的字段,这些字段记录了本条数据的一下信息,这些信息属于是MySQL服务器为了描述这条记录(行数据)而不得不额外添加的一些信息。

这几种行格式大同小异,都是在你的表的基础上给你增加几个隐形的字段,目的是为了加快MySQL的运行效率。

本篇文章只描述一下Compact行格式。

3. Compact行格式

Compact行格式给表增加了三个额外字段:变长字段长度列表NULL值列表记录头信息

  • 变长字段长度列表:你的有些字段的值的长度是不确定的,例如varchar()、bolg、text这些类型,数据的长度不固定,但是MySQL解析的时候又不想猜你有几个字节,所以就使用这个列表记录所有会变化的字段的长度。
  • NULL值列表:有的字段的值是可以为空的,这些数据是不需要解析处理的,所以MySQL会将这些字段记录下来。(主键和not null 关键字修饰的字段不能为空,所以不会被记录)
  • 记录头信息:有很多字段组成,不同字段有不同的作用,主要有:标记该记录是否被删除、标记该记录是否是B+树叶子节点、该记录在记录堆中的位置信息…

image

这三个字段是MySQL提供给自己使用的。现在详细看看它们。

  1. 变长字段的长度列表

    如名字所示,你的表中有多少字段的值的长度是可变的,它就记录这些可变的数据的长度。

    我们知道MySQL中支持一些不定长的数据类型:varchar、blog、text、longtext…我们可以将这些数据类型的列称为变长字段,变长字段中存储多长字节的数据是不固定的,所以MySQL将这些数据存储时顺便存上它们的长度,这样就可以更快的解析处理了。

    在compact行格式中,把所有变长字段的真实数据占用的字节长度都存放在记录的开头位置,从而形成一个长度列表,称为变长字段的长度列表,各个变长字段数据占用的字节数按照列的顺序逆序存放。强调一下,逆序存放

    假如现在有三个字段:id、name、password,其中id是int类型,所以它不是变长字段,name和password都是varchar类型,它们是变长字段,所以长度列表中会记录他俩的长度。

    name: xiaoming 
    password: 123
    

    如上,name的长度是8个字节,十六进制是0x08;password是3个字节,十六进制是0x03。

    存储在列表中就是:0308。

    放在整个行中就是:

    image但是还有一个问题:如果某个字段存储的数据特别多,你只用一个字节可以存吗?或者说:你怎么知道03代表长度还是0308代表长度呢?

    放心 ,InnoDB 有它的一套规则。这里就不展开讲述了。

    另外需要注意的是:变长字段长度列表中只存储非NULL的列内容占用的长度,那肯定啊,为NULL的值你记录它干啥?

    同时,这个列表的中的字段不仅仅会被变长字段影响,还会被MySQL所使用字符集影响:

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

  2. NULL值列表

    某些表中的某些列可能存储NULL值,MySQL会将这些值为NULL的列统一管理起来,存储到NULl值列表中。

    首先,主键和被not null 修饰的字段不会被存储。其次,如果此行的数据没有NULL值,这个NULL值列表也就没有意义了。

    否则,每一个允许存储NULL值的字段对应一个二进制位,二进制位按照字段的顺序逆序排序,强调:逆序。

    二进制位的意义:

    • 二进制位的值为1:该字段的值为NULL。
    • 二进制位的值为0:该字段的值不为NULL。

    如下:

    image但是MySQL规定NULL值列表必须使用整数个字节的位表示,即:8、16、32…

    并且,对于这一行数据来说,值为NULL的字段是不被存储的。

    所以上面那张图完善一下其实是这样:

    image

  3. 记录头信息

    这个字段固定有5个字节,即40个二进制位,不同的位代表不同的意思,如下:

    image

名称大小(bit)作用
预留位2待使用
delete_mask1该记录是否被删除
min_rec_mask1B+树的每层非叶子节点中的最小记录都会添加该标记
n_owned4表示当前记录拥有的记录数
heap_no13表示当前记录在页中的位置
record_type3表示当前记录的类型0:普通记录1:表示B+树非叶子节点记录2:表示最小记录3:表示最大记录
next_record16表示下一条记录的相对位置

看到delete_mask大家可能会有些疑惑:这个标志不是“该条记录是否被删除”吗?我们删除一条数据之后MySQL原来并没有真正的删除它?对,MySQL执行的也是逻辑删除,至于具体是怎样做的,就在数据具体的存储方式:InnoDB - 页结构 ​中与其他头信息一起说吧~。

  1. 隐藏字段

    背过MySQL面试题的大概都知道,在创建表的时候MySQL提供了几个隐藏字段(实现MVCC机制的三个隐藏字段)

    • row_id:行id,唯一标识
    • transaction_id:操作此行数据的事务的id
    • roll_pointer:回滚指针

    大家可能都背过,这里就不展开讲了。于是我们创建的表,加上所有隐藏字段之后其实是这样的:

    image

综上所述就是MySQL的Compact行格式。

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

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

相关文章

Java8 Stream详解及中间操作方法使用示例(一)

Java 8 引入了 Stream API,提供了一种新的处理集合和数组的方式。Stream API 可以让我们更加便捷、灵活地处理数据,尤其是大规模数据。在这里,我将详细介绍 Java 8 中的 Stream API。 什么是 Stream Stream 是 Java 8 中引入的一个新的概念&…

vs2022配置pcl1.13.1

下载 下载PCL预编译安装程序PCL-1.13.1-AllInOne-msvc2022-win64.exe 和要安装的PCL组件(例如pcl-1.13.1-pdb-msvc2022-win64.zip) 安装 双击 PCL-1.13.1-AllInOne-msvc2022-win64.exe进行安装。到图1的步骤时,选择第二项。 图1 下一步&am…

串口助手(布局,图标,串口号,隐藏界面,显示实时时间)

文章目录 前言一、串口助手布局二、设置软件的标题,图标三、显示可用串口号四、隐藏,显示面板五、显示实时时间总结 前言 从这篇文章开始 教大家自己制作一个串口助手软件,并实现基本的功能。学做一个 串口助手可以一边回顾复习 QT 的相关知…

《面试1v1》G1垃圾回收器

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 《面试1v1》 连载中… 面试官: G1垃圾收集器?听说很牛逼的样子! 候选人: 是的,G1是JDK9默认的垃圾收集器,代替了CMS收集器。它的目标是达到…

4.运算符|Java学习笔记

文章目录 运算符介绍算术运算符关系运算符(比较运算符)逻辑运算符赋值运算符三元运算符位运算符 运算符优先级Java命名规范关键字保留字 进制十进制转(二/八/十六进制)原码、反码、补码 运算符介绍 运算符是一种特殊的符号&#…

【Linux】认识Linux下的编译器gcc/g++ | 认识动静态库

本文思维导图: 文章目录 前言tips: 关于前两篇文章所提到的sudo指令 一、gcc/g编译器的认识和使用tips 1.预处理2. 编译3.汇编4.链接关于预编译,编译,汇编阶段的指令记忆方法 二、gcc/g指令汇总三、认识动静态库1.库的认知库的命名规则静态库…

C++ ---- 继承

目录 继承概念及定义 继承概念 继承定义 语法 继承关系和访问限定符 继承基类成员访问方式的变化 规律总结 以公有继承为例测试 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 构造函数 析构函数 拷贝构造 赋值重载 继承与友元 继承与静态成员…

ESP8266调用NTP服务器进行时间校准

一、背景知识 【1】什么是NTP服务器? NTP是网络时间协议(Network Time Protocol,简称NTP),是一种用于同步计算机时间的协议。NTP服务器指的是提供NTP服务的计算机或设备。NTP服务器的主要功能是保证网络上的所有设备…

Linux下信号量使用总结

目录 1.Linux下信号量简介 2.POSIX信号量 2.1 无名信号量 2.2 有名信号量 3.System V信号量 1.Linux下信号量简介 信号量是解决进程之间的同步与互斥的IPC机制,互斥与同步关系存在的症结在于临界资源。 临界资源是在同一个时刻只容许有限个(一般只有…

ble系统知识介绍(较为完整,持续更新中)

BLE学习 现在网上关于BLE系统的学习资料实在是太少了,因此本文希望能够聚集一些资料能够系统的入门BLE,本文翻译自Bluetooth_LE_Primer_Paper,还有一些网上的一些资料,如果侵害到了某些作者的权益请及时联系我 参考资料和链接 Bluetooth_LE_Primer_Paper_3MtXws-zP…

GitOps 实践之渐进式发布

本文作者:陈钧桐 腾讯云 CODING DevOps 高级解决方案架构师,从事多年技术布道工作,对于云原生时代下企业数字化转型、IT 与 DevOps 建设、价值流体系搭建等有丰富的经验,曾为多家大型企业提供咨询、解决方案以及内训服务。既关注工…

【Python小技巧】加密又提速,把.py文件编译为.pyd文件(类似dll函数库),你值得拥有!

文章目录 前言一、常见的Python文件格式有哪些?二、准备编译环境1. 安装cython2. 安装Microsoft C 生成工具 三、编译.py文件为.pyd文件1. 编辑原始.py文件2. 准备setup.py文件3. 进行编译 四、测试总结 前言 Python的脚本文件是开源的,若直接发布&#…

i.MX RT1010跨界MCU上手体验(上)

由于项目需要性价比高一些的高性能MCU,了解到NXP的RT1010主频高达500MHZ的MCU,半个月以前已经拿到官方Demo板了,今天抽空上电体验下,在此记录。这颗芯片的优势是主频高,功能全,价格合理,但是需要…

第六章 方法区

文章目录 前言一、🛺 栈、堆、方法区的交互关系二、🚎 方法区的理解1、方法区在哪里2、方法区的演变过程 三、🚗 设置方法区的大小与 OOM1、设置方法区内存的大小2、使用CGLib 让方法区OOM3、如何解决 OOM4、方法区的内部结构5、non-final 的…

利用提示工程优化软件架构:ChatGPT的应用

ChatGPT时代的软件架构全生命周期 简介 在如今日新月异的技术环境中,软件架构师必须不断地寻找和采纳新的工具和方法,以优化开发过程,提高效率,并保证最终产出的质量。其中,人工智能(AI)已经成…

《淘宝技术这十年》读书笔记

一. 分布式时代 在系统发展的过程中,架构师的眼光至关重要,作为程序员,只要把功能实现即可,但作为架构师,要考虑系统的扩展性、重用性,对于这种敏锐的感觉,有人说是一种“代码洁癖”。淘宝早期…

使用双屏时两个屏幕的色调、亮度不一样如何设置?

当使用双屏时,即使两个屏幕的型号一致也可能存在色差的问题(色调不一致,亮度不一致),以下是解决此问题的方法。 Step1.同时按下两个屏幕下方的ok按钮 Step2.此时会进入显示器的OSD界面 Step3.通过按键切换菜单 Step4.…

节省35% MCU开发成本的红外智能洗手器运用方案,N9300-S16音乐芯片

随着全国人民生活水平的逐步提升以及近期疫情影响,公民的健康保护意识也越来越强,洗手液越来越被人们重视以及提倡,即时在受疫情影响是2022年洗手液市场规模也是上升至恐怖34亿元产值;而近年来自动感应洗手液器凭借实用性、便携性…

APP测试面试题快问快答(三)

11. App安装测试的主要内容有哪些? App是客户端程序,客户端程序就需要进行安装才能使用,因此需要测试安装、卸载、升级测试 关注点:正常场景、异常场景。 正常场景: 1. 在不同的操作系统上安装 2. 从不同的安装渠…

windows10安装ElasticSearch

一 安装 Java环境 ElasticSearch使用Java开发的,依赖Java环境,安装 ElasticSearch 之前,需要先安装一个较新版本的 Java,jdk 1.8版本太低了,需要安装jdk 11或更高版本。 Java安装方法请参考 Java 15环境安装 。 二 …