• 【Mysql】 InnoDB引擎深入- 行格式


            前面已经介绍了InnoDB的数据页结构,我们已经了解了InnoBD种数据和索引的存储结构以及页的概念。现在我们知道了数据库数据是以行存储在页种user record中的,那么现在就来了解下表的行格式。

    ​ 根据官方描述:

    ​ 表的行格式决定了其行的物理存储方式,这反过来又会影响查询和 DML 操作的性能。随着更多的行适合单个磁盘页面,查询和索引查找可以更快地工作,缓冲池中需要更少的高速缓存,并且需要更少的 I/O 来写出更新的值。

    ​ 可变长度列是列值存储在 B 树索引节点中的规则的一个例外。太长而无法放入 B 树页面的可变长度列存储在单独分配的磁盘页面上,称为溢出页面。此类列称为离页列。页外列的值存储在溢出页的单链表中,每个这样的列都有自己的一个或多个溢出页的列表。根据列长度,所有或可变长度列值的前缀都存储在 B 树中,以避免浪费存储空间并不得不读取单独的页面。

    存储引擎支持四种行InnoDB格式:REDUNDANTCOMPACTDYNAMICCOMPRESSED,默认DYNAMIC

    表 14.9 InnoDB 行格式概述

    行格式紧凑的存储特性增强的可变长度列存储大索引键前缀支持压缩支持支持的表空间类型所需文件格式
    REDUNDANTsystem, file-per-table, generalAntelope or Barracuda
    COMPACT是的system, file-per-table, generalAntelope or Barracuda
    DYNAMIC是的是的是的system, file-per-table, generalBarracuda
    COMPRESSED是的是的是的是的file-per-table, generalBarracuda

    当前引擎中默认行格式为DYNAMIC(动态的),几种行格式基础格式差异不大,根据官网描述:

    DYNAMIC行格式是行格式的一种变 体COMPACT。有关存储特性,请参阅 COMPACT 行格式存储特性

    那我们就直接看下COMPACT 行格式:

    我们向数据库插入一条数据,那么这条数据在磁盘上的存储格式是什么样的呢?

    大致介绍下相关内容:

    1、变长字段宽度列表(2字节):对于可变长度列的长度时不固定的,该列表用于记录可变列长度字段长度。占用1~2字节。如果行中不存在可变长度列,则栏位不创建不占用空间。

    2、null值列表(1~2字节):用于记录null值字段表标识,举个例子:如果插入的数据为 A - null - B 三个字段值,其实行真实数据中存储的是AB,而这次null列表中存储:101 (1代表非null,0标识null),最后查询根据两者的关系确定null值。这样做的目的也是为了节省空间,毕竟使用占位符代替null或者其他方式都是需要消耗空间的。同样的如果行中不存在null值列,即所有列都设置为not null时,该null值列表也不会创建。

    3、记录头信息(5字节):记录头信息主要记录着这条数据的一些信息,如下:

    • delete-flag:是否删除,在数据库中进行delete操作,其实并不会立马从磁盘上删除的,而是进行删除标记。在空余时间再进行删除处理。( truncate和drop语句就是直接删除)
    • record_type :表示该条记录的类型,因为页中有很多数据,类型可能都不一样,比如:

                ----   000 表示普通记录

                ----   001 表示b+树非叶子节点的目录项记录

                ----   010 表示infimum记录(即一页中最小的记录)

                ----   011 表示supremum记录(即一页中最大的记录)

                ----   1** 保留

    • next_record:表示指向下一条记录的地址指针(innodb中可以通过一条记录找到下一条记录就是通过这个指针实现的)
    • n_owned:记录该组数据条数,上面数据页结构说过了,一个数据页为了优化会分为n个组,将每个组的最小主键作为"key" ,该类型数据n_owned则记录着本组的所有条数,而其他数据则都为0。
    • 4、row_id(6字节):InnoBD引擎下,创建表时没有创建主键或者没有唯一索引的情况下,会默认生成row_id字段作为主键,占有6字节。如果已存在可作为主键字段,则不会创建该字段。
    • 5、trx_id(6字节) :记录最近修改本条记录的事务ID.
    • 6、roll_pointer(7字节):滚动指针字段。
  • 相关阅读:
    Ban or Pick, What‘s the Trick
    setTimeout() 和 setIntervale() 小结
    Hadoop总结——HDFS
    IDEA01:Maven环境配置
    P1830 轰炸III
    React中useEffect Hook使用纠错
    QML(25)——文本输入框组件的区别(TextField TextInput TextArea TextEdit)
    代码随想录刷题|买卖股票问题的总结
    【C语言】【结构体的位段】位段的内存分配及注意事项
    在PHP8中遍历数组-PHP8知识详解
  • 原文地址:https://blog.csdn.net/qq_31142237/article/details/125448010