Mysql是怎样运行的之Inno页介绍

news2025/7/19 2:57:53

一、InnoDB介绍

InnoDB是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的,所以需要把磁盘中的数据加载到内存中,如果是处理写入或修改请求的话,还需要把内存中的内容刷新到磁盘上。而我们知道读写磁盘的速度非常慢,和内存读写差了几个数量级,所以当我们想从表中获取某些记录时,InnoDB存储引擎需要一条一条的把记录从磁盘上读出来么?不,那样会慢死,InnnoDB采取的方式是:将数据分为若干页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为16KB也就是在一般情况下,一次最少从磁盘中读取16KB内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。

二、 InnoDB行格式

我们平时是以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为行格式或者记录格式。设计InnoDB的大叔们到现在为止设计了4种不同类型的行格式,分别为Compact\Redundant、Dynamic和Compressed行格式,随着时间的推移,他们可能会设计出更多的行格式,但是不管怎么变,在原理上都是相同的。

2.1指定行格式的语法

我们可以在创建或修改表的语句中指定行格式:

create table 表名 (列的信息)row_format=行格式名称
alter table  表名 row_format=行格式名称

比如我们在yuanxiaoxu数据库中创建一个演示用的表record_format_demo,可以这样指定它的行格式:

mysql> USE yuanxiaoxu;
Database changed
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)
)

可以看到我们刚刚创建的这个表的行格式就是Compact,另外我们还显式指定了这个表的字符集为ascii。再向表中插入几条数据,现在表中的记录就是这个样子的。

mysql> SELECT * FROM record_format_demo;
+------+-----+------+------+
| c1 | c2 | c3 | c4 |
+------+-----+------+------+
| aaaa | bbb | cc | d |
| eeee | fff | NULL | NULL |
+------+-----+------+------+
2 rows in set (0.00 sec)

演示表的内容也填充好了,现在我们就来看看各个行格式下的存储方式到底有啥不同吧

2.2 COMPACT行格式

废话不多说,直接看图:

在这里插入图片描述
大家从图中可以看出来,一条完整的记录其实可以被分为记录的额外信息和记录真实数据两大部分,下边我们详细看一下这两部分的组成。

2.2.1 记录的额外信息

这部分信息是服务器为了描述这条记录而不得不额外添加的一些信息,这些信息分为3类,分别是变长字段长度列表、NULL值列表和记录头信息,我们分别看一下。

变长字段长度列表
我们知道Mysql支持一些变长的数据类型,比如VARCHAR(M)、VARBINARY(M)、各种TEXT类型,各种BLOB类型,我们也可以把拥有这些数据类型的列称为变长字段,变长字段中存储多少字节的数据是不固定的,所以我们在存储真实数据的时候需要顺便把这些数据占用的字节数也存起来,这样才不至于把Mysql服务器搞懵,所以这些变长字段占用的存储空间分为两部分:

  1. 真正的数据内容
  2. 占用的字节数

在Compact行格式中,把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位,从而形成一个变长字段长度列表,各变长字段数据占用的字节数按照列的顺序逆序存放,我们再次强调一遍是逆序存放

   我们拿record_format_demo表中的第一条记录来举个例子。因为record_format_demo表的c1、c2、c4列都是varchar(10)类型的,也就是变长的数据类型,所以这三个列的值长度都需要保存在记录开头处,因为record_format_demo表中的各个列都是用的是ascii字符集,所以每个字符只需要1个字节来进行编码,来看一下第一条记录各变长字段内容的长度:

在这里插入图片描述

又因为这些长度值需要按照列的逆序存放,所以最后变长字段长度列表的字节串用十六进制表示的效果就是(各个字节之间实际上没有空格,用空格隔开只是方便理解):01 03 04
把这个字节串组成的变长字段长度列表填入上边的示意图中的效果就是:

在这里插入图片描述
NULL值列表
我们知道表中的某些列可能存储NULL值,如果把这些NULL值都放到记录的真实数据中存储会很占地方,所以Compact行格式把这些值为NULL的列统一管理起来,存储到NULL值列表中,他的处理过程是这样的:

  • 首先统计表中允许存储NULL的列有那些

我们前面说过,主键列,被NOT NULL修饰过的列都是不可以存储NULL值的,所以在统计的时候不会把这些列算进去。

  • 如果表中没有允许存储NULL的列,则NULL值列表也就不存在了,否则将每个允许存储NULL的列对应一个二进制位,二进制位按照列的顺序逆序排列,二进制位表示的意义如下:

二进制的值为1时,代表该列的值为NULL。
二进制位的值为0时,代表该列的值不为NULL.

记录头信息
除了变长字段长度列表、NULL值列表之外,还有一个用于描述记录的记录头信息,它是由固定的5各字节组成。5个字节也就是40个二进制位,不同的位代表不同的意思,如图:
在这里插入图片描述

这些二进制位代表的详细信息如下表:

在这里插入图片描述
大家不要被这么多的属性和陌生的概念给吓着,我这里只是为了内容的完整性把这些位代表的意思都写了出来,现在没必要把他们的意思都记住,记住也没啥用,现在只需要看一遍混个脸熟,等之后用到这些属性的时候我们再回过头来看。

2.2.2 记录的真实数据

对于record_format_demo表来说,记录的真实数据除了cq,c2,c3,c4这几个我们自己定义的列的数据以外,Mysql会为每个记录默认的添加一些列(也称为隐藏列),具体的列如下:
在这里插入图片描述

tips:
这里需要提一下InnoDB表对主键生成策略:优先使用用户自定义主键作为主键,如果用户没有定义主键,则选取一个Unique键作为主键,如果表中连Unique键都没有定义的话,则InnoDB会为表默认添加一个名为riw_id的隐藏列作为主键。所以我们从上表中可以看出:InnoDB会为表默认添加一个名为row_id的隐藏列作为主键。

所以我们从上表中可以看出:InnoDB存储会为每条记录都添加transaction_id和roll_pointer这两个列,但是row_id是可选的(在没有自定义主键以及Unique键的情况下才会添加该列)。这些隐藏列的值不用我们操心,InnoDB存储引擎会自己帮我们生成的。

现在我们看一下加上记录的真实数据长成什么样吧:
在这里插入图片描述
注意:
  注意第2条记录中c3和c4列的值都为null,他们被存储在了前边的NULL值列表处,在记录的真实数据处就不再冗余存储,从而节省存储空间。

2.2.3CHAR(M)列的存储格式

record_format_demo表的c1,c2,c4列的类型是varchar(10),而c3列的类型是char(10),我们说在compact行格式下只会把变长类型的列的长度逆序存到变长字段长度列表中。
这就意味着:对于char(m)类型的列来说,当列采用的是定长字符集时,该列占用的字节数不会被加到变长字段长度列表,而如果采用变长字符集时,该列占用的字节数也会被加到变长字段长度列表

2.3 Redundant行格式

其实知道了Compact行格式之后,其他的行格式就是依葫芦画瓢了。我们现在要介绍的Redundant行格式是Mysql5.0之前用的一种行格式,也就是说它已经非常老了,但是本着知识完整性的角度还是要提一下,大家乐呵乐呵的看就好。
画个图展示一下Redundant行格式的全貌:
在这里插入图片描述

现在我们把表record_format_demo的行格式修改为Redundant:

mysql> ALTER TABLE record_format_demo ROW_FORMAT=Redundant;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0

为了方便大家理解和节省篇幅,我们直接把表record_format_demo在redundant行格式下的两条记录的真实存储数据提供出来,之后我们着重分析两种行格式的不同即可。
在这里插入图片描述
下边我们从各个方面看一下 Redundant 行格式有什么不同的地方:

  • 字段长度偏移列表
    注意 Compact 行格式的开头是 变长字段长度列表 ,而 Redundant 行格式的开头是 字段长度偏移列表 ,与
    变长字段长度列表 有两处不同:
  • 没有了变长两个字,意味着 Redundant 行格式会把该条记录中所有列(包括 隐藏列 )的长度信息都按
    照逆序存储到 字段长度偏移列表 。
  • 多了个偏移两个字,这意味着计算列值长度的方式不像 Compact 行格式那么直观,它是采用两个相邻数
    值的差值来计算各个列值的长度。比如第一条记录的 字段长度偏移列表 就是:

25 24 1A 17 13 0C 06因为它是逆序排放的,所以按照列的顺序排列就是:

06 0C 13 17 1A 24 25按照两个相邻数值的差值来计算各个列值的长度的意思就是:

  • 记录头信息

Redundant 行格式的记录头信息占用 6 字节, 48 个二进制位,这些二进制位代表的意思如下:

  • 预留位1 | 没有使用
  • 预留位2 | 没有使用
  • delete_mask 标记该记录是否被删除
  • min_rec_mask B+树的每层非叶子节点中的最小记录都会添加该标记
  • n_owned 表示当前记录拥有的记录数
  • heap_no 表示当前记录在页面堆的位置信息
  • n_field 表示记录中列的数量
  • byte_offs_flag 标记字段长度偏移列表中每个列对应的偏移量是使用1字节还是2字节表示的
  • next_record 表示下一条记录的相对位置|
    第一条记录中的头信息是:

00 00 10 0F 00 BC

其他的情况两个行格式差不太多

💥推荐阅读💥

上一篇:一、SpringBoot核心教程之入门篇-认识SpringBoot

下一篇:三、SpringBoot核心教程之Web开发过程分析

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

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

相关文章

Java数据结构 —— 手写线性结构(稀疏数组、栈、队列、链表)

目录 稀疏数组 顺序表 链表 单向顺序链表 双向链表 双向循环链表求解约瑟夫环(Joseph) 栈 顺序栈 队列 顺序队列 顺序循环队列 稀疏数组 当一个数组中大部分值为0,或者相同时,可以采用稀疏数组的方式来保存,从而节约存储…

代码随想录算法训练营day41 | 动态规划 01背包问题基础 01背包问题之滚动数组

01背包问题基础 问题描述 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 举个栗子 背包最大重量为4。 物品为: 重量价值…

文本生成图像简述4——扩散模型、自回归模型、生成对抗网络的对比调研

基于近年来图像处理和语言理解方面的技术突破,融合图像和文本处理的多模态任务获得了广泛的关注并取得了显著成功。 文本生成图像(text-to-image)是图像和文本处理的多模态任务的一项子任务,其根据给定文本生成符合描述的真实图像…

VUE3源码分析————rollup打包

文章目录什么是rolluprollup打包和webpack打包的区别rollup打包准备一、安装yarn开始rollup打包一、初始化二、package.json文件配置三、新建并配置打包文件夹四、下载rollup及打包执行文件五、文件大致分布![image.png](https://img-blog.csdnimg.cn/img_convert/66f1a85ff57d…

基于servlet学生宿舍管理系统

一、项目简介 本项目是一套javaWeb基于servlet学生宿舍管理系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试,…

【Unity VR开发】结合VRTK4.0:创建物理按钮

语录: 如今我努力奔跑,不过是为了追上那个曾经被寄予厚望的自己 前言: 使用线性关节驱动器和碰撞体从动器可以轻松创建基于物理的按钮,以使交互者能够在物理上按下按钮控件,然后挂钩到驱动器事件中以了解按钮何时被按…

追梦之旅【数据结构篇】——详解C语言实现顺序队列

详解C语言实现顺序队列~😎前言🙌预备小知识🙌队列的概念及结构😊1.顺序队列头文件编写🙌2.Queue.c文件的编写🙌1)队列的初始化函数实现😊2)队列的销毁函数实现&#x1f6…

Leetcode DAY 44: 完全背包 and 零钱兑换 II and 组合总和 Ⅳ

完全背包518. 零钱兑换 II&#xff01;&#xff01;&#xff01;程序未通过原因&#xff1a; 1、dp数组的初始化没考虑清楚 2、组合问题 dp数组的更新没考虑清楚 修改后&#xff1a; class Solution { public:int change(int amount, vector<int>& coins) {// dp[j…

python保留小数函数总结

python保留小数——‘%f’‘%.nf’% x&#xff08;定义的变量&#xff09; 例子&#xff1a;a 82.16332 print(%.1f% a) print(%.2f% a) print(%.3f% a) print(%.4f% a) print(%.10f% a)输出结果python保留小数——format&#xff08;&#xff09;函数Python2.6 开始&#xff…

【Zotero】文献阅读神器Zotero打造个人移动图书馆

1、 将zotero portable版装入移动硬盘 zotero portable下载链接 2、 安装zotfile管理附件 官网&#xff1a;http://zotfile.com/ 下载好之后&#xff0c;打开Zotero&#xff0c;依次点击菜单栏工具&#xff08;tools&#xff09;-插件&#xff08;Add-ons&#xff09;&#…

Vue3 中组件的使用(上)

目录前言&#xff1a;一、什么是组件二、注册组件1. 全局注册2. 局部注册二、传递数据【父 -> 子】1. 字符串数组的形式2. 对象的形式三、组件事件【子 -> 父】1. 字符串数组式声明自定义事件2. 【子组件】触发组件事件3. 【父组件】监听子组件自定义事件4. 组件事件例子…

【大数据】记一次hadoop集群missing block问题排查和数据恢复

问题描述 集群环境总共有2个NN节点&#xff0c;3个JN节点&#xff0c;40个DN节点&#xff0c;基于hadoop-3.3.1的版本。集群采用的双副本&#xff0c;未使用ec纠删码。 问题如下&#xff1a; bin/hdfs fsck -list-corruptfileblocks / The list of corrupt files under path…

AI算法创新赛-人车目标检测竞赛总结04

队伍&#xff1a;AI000038 小组成员&#xff1a;杨志强&#xff0c;林松 1. 算法介绍 1.1 相关工作 当前流行的目标检测算法主要分为三种&#xff0c;一阶段算法&#xff1a;SSD&#xff0c;FCOS&#xff0c;Scaled&#xff0c;YOLO系列等&#xff1b;二阶段算法&#xff1a…

宝塔搭建实战php悟空CRM前后端分离源码-后端server篇(一)

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 有个朋友发消息跟我说&#xff0c;能不能让我录制一期一套开源的悟空CRM系统&#xff0c;然后网上搜了下&#xff0c;搭建起来测试后&#xff0c;感觉还不错&#xff0c;是一套前后端分离的CRM系统&#xff0c;前…

Java浅析电信数据采集

技术&#xff1a;Java等摘要&#xff1a;电信运营系统中&#xff0c;电信计费系统是主要的支撑系统&#xff0c;占有重要地位。对于电信计费系统是电信运营商的核心竞争力之一这一观点愈来愈被业界认同。电信计费系统中的数据蕴含着企业经营态势、客户群分布特征及消费习惯、各…

什么是隔离式数字输入?

隔离式数字输入与数字隔离器虽然它们听起来很相似&#xff0c;但隔离式数字输入和数字隔离器之间实际上存在一些值得注意的差异。看完这篇文章&#xff0c;希望大家能轻松分辨出两种隔离功能的区别。 内部结构 数字隔离器具有提供电流隔离数字信号路径的基本&#xff08;或经…

网易的“草长莺飞二月天”:增长稳健,加码研发,逐浪AI

2月23日&#xff0c;网易发布了2022年第四季度财报。 这是网易与暴雪分道扬镳后的首份财报&#xff0c;加上近期AIGC热度扩散至游戏、教育等各个领域&#xff0c;网易第四季度业绩及其对于GPT等热门技术的探索受到市场关注。 根据财报&#xff0c;第四季度&#xff0c;网易营…

从单管单色到单管RGB,这项MicroLED工艺不可忽视

微显示技术商Porotech&#xff0c;在CES 2023期间展示了最新的MicroLED显示模组。近期&#xff0c;AR/VR光学领域的知名博主Karl Guttag深度分析了该公司的微显示技术&#xff0c;并指出Porotech带来了他见过最有趣的MicroLED技术。Guttag表示&#xff1a;Porotech是本届CES上给…

Airbyte的同步复制模式

ELT 哲学的核心原则&#xff0c;即数据在提取和加载阶段移动时应保持不变&#xff0c;以便始终可以在目标中访问原始数据。由于目标中存在数据的未修改版本&#xff0c;因此将来可以重新转换该版本&#xff0c;而无需从源系统重新同步数据。 基于此哲学&#xff0c;我们看看Air…

已经准备上千道软件测试面试题了,建议大家收藏!!!还有视频详解!

2023华为软件测试笔试面试真题&#xff0c;抓紧收藏不然就看不到了_测试小鬼的博客-CSDN博客_华为软件测试工程师面试题1、对计算机软件和硬件资源进行管理和控制的软件是&#xff08;D&#xff09;A.文件管理程序B.输入输出管理程序C.命令出来程序D.操作系统2、在没有需求文档…