• Compact格式下MySQL的数据如何存储到磁盘


    查找文件存储格式

    在MySQL命令行输入

    show table status;
    
    • 1

    得到的Row_format列就是磁盘的存储格式

    在InnoDB 1.0.X之前,InnoDB存储引擎提供了Compact和Redundant两种格式来存放行记录数据。
    
    在InnoDB 1.0.X之后,开始又引入了新的文件格式(file format),新引入的文件格式称为Barracuda文件格式。
    
    • 1
    • 2
    • 3

    Barracuda文件格式下拥有两种新的行记录格式:Compressed和Dynamic。

    AntelopeBarracuda
    Compact、RedundantCompact、Redundant、Compressed和Dynamic

    查看Innodb存储引擎的文件格式

    show variables like 'innodb_file_format';
    
    • 1

    Dynamic和Compact格式基本相同,只在行溢出数据的处理上有区别。

    变长字段varchar存储数据

    假设存储下列两行数据

    varchar(8)char(3)char(4)
    第一行Innodbab
    第二行Mysqlxy

    上述数据的格式虽然以行的形式出现,但实际上在磁盘中并没有这种

    第一行数据存储形式如下:

    0x06null标志位记录头信息Innodbab
    第一列表示Innodb占据了6个字符,用十六进制表示为`0x06`
    根据变长字段长度列表中描述的变长字段的信息去查找变长字段。
    该列只记录变长类型的字符,定长的跳过省略。
    
    • 1
    • 2
    • 3

    第二行数据存储形式如下:

    0x05null标志位记录头信息Mysqlxy
    第一列表示Mysql占据了5个字符,用十六进制表示为`0x05`
    
    • 1

    假设存储多个变长类型的数据,如下

    varchar(10)varchar(10)varchar(10)char(1)
    linuxubuntucentosx
    mysqlmongodbredisy
    httpnginxapachez

    当有多个变长的数据时,只存储变长数据,并且按照列的逆序存放

    在这里插入图片描述
    不难看出,第一列存放三个变长字符类型的长度(用十六进制表示)。
    以第三行为例,http、nginx、apache分别是4、5、6位,在实际存储时逆序存放,就像第一列所展示的,6、5、4。

    所以总结一下:

    变长字段列表(逆序存放)null标志位记录头信息数据A数据B数据C

    null值的存储方式

    规定:
    若有Null值,bit位置是1
    字段值不为null,bit位置是0

    通过创建下列一张表来说明:

    CREATE TABLE `students` (
    
      `name` varchar(10) NOT NULL,
    
      `address` varchar(255) DEFAULT NULL,
    
      `gender` char(1) DEFAULT NULL,
    
      `class` varchar(10) DEFAULT NULL,
    
      `hobbies` varchar(255) DEFAULT NULL,
    
      PRIMARY KEY (`name`)
    ) 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    其中已经插入了一行数据:

    nameaddressgenderclasshobbies
    rolesmhobby_xx

    在第一列的变长字段列表中存储的信息:

    name   roles   变长型  5个字符长度  0x05  字段读取成功
    address  为空    字段读取结束
    gender   定长型    字段读取结束
    class   为空    字段读取结束
    hobbies   hobby_xx  变长型   8个字符长度   0x08  字段读取成功
    
    • 1
    • 2
    • 3
    • 4
    • 5

    综上所述,根据逆序存放原则,第一列的内容是0x08 0x05

    在这里插入图片描述

    补充说明:

    一个数据页就是16K大
    数据页中的数据是一行行记录的
    当行很大并且超过了数据页的大小
    这就是行溢出
    
    通过数据页里存放指针的bit位将其连接
    此时数据页之间会用链表连接起来
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    微信输入法来了,一起来体验一下吧
    java毕业设计钢材销售平台登录mybatis+源码+调试部署+系统+数据库+lw
    JAVA泛型_泛型类、接口、通配符、方法、上下边界
    SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.4 手机验证码案例 - 验证码校验
    Servlet
    行情分析——加密货币市场大盘走势(10.16)
    java基础笔记之println和print的区别,以及数据类型转换,运算符
    Flask python 开发篇:配置文件
    【吴恩达·机器学习】第四章:详解神经网络:推理和训练
    Dubbo后台管理和监控中心部署
  • 原文地址:https://blog.csdn.net/oldboy1999/article/details/126092361