专栏首页DBA随笔Innodb数据页简介(2)

Innodb数据页简介(2)

Innodb数据页简介(2)

01

概念介绍

3月17号的文章里面,我们提到了innodb的数据页结构,我们知道,页是内存和磁盘交互的基本单位,它的大小一般是16KB,可以被分为如下几个部分:

上次的文章里面,我们对这几个部分大概做了介绍,今天我们说说上面数据页的蓝色部分。

该部分保存的是数据页中真正的数据记录,也就是用户存储的记录。当我们一开始生成页的时候,其实并没有蓝色的Record部分,而是随着我们不断给数据库中插入记录,才逐渐从Free Space中划分出来的空间。用示意图来描述就是:

如果Free Space中的数据页被分配完了,则去申请新的数据页。

为了方便理解,我们现在创建一个表进行演示:

CREATE TABLE test(
    ->     c1 INT,
    ->     c2 INT,
    ->     c3 VARCHAR(1000),
    ->     PRIMARY KEY (c1)
    -> ) engine=innodb charset=utf8;
Query OK, 0 rows affected (0.03 sec)

现在我们给这个表里面插入几条数据:

insert into test values
(1,2,'a'),
(2,3,'bb'),
(3,4,'ccc'),
(4,5,'dddd');

我们可以把上面的数据页结构简单表示如下:

我们可以看到,每条记录由三个部分构成,分别是记录头、记录数据以及其他信息,其中记录头里面包含很多字段来表示该条记录的信息,这些字段我们会逐渐进行讲解。目前4条记录都已经插入到record部分了,在实际过程中这四条记录是通过链表的方式进行连接的,如下:

在第一张图的数据页中,蓝色部分还有一部分是infimum和supermun,它们是两条伪记录,它们分别是这个数据页中"指定的"最大的记录和最小的记录。它们的作用是作为当前数据页内数据链表的首末两端。这样,数据页中的数据就可以被我们排列成下面的样子:

我们已经可以看到,我们的主键按照从大到小的顺序形成了一个链表,链表的首末位置分别是两条伪记录。

当我们对数据记录中id=2的一条记录进行删除时,实际上,在数据记录链表里面发生的变化如下:

可以看出,实际上并没有删除那条记录,而是通过将头信息中的delete标识位改为1、偏移量改为0来实现的,也就是说,这条记录所占用的空间并没有还给Free Space,当下一次插入id=2的记录的时候,这块空间还可以接着使用。

在这个过程中,我们加入了record_type字段,这两条伪记录和正常记录的区别之处在于数据记录的头信息里面的record_type字段,最小记录的record_type为2,最大记录的record为3,正常记录的record_type为0,record_type为1的记录,稍后我们会进行解释。

到现在为止,我们已经知道了头信息中的3个字段,分别是next_record和record_type以及delete字段,next_record保存的是下一条数据记录的真是数据的偏移量,record_type代表的是数据记录的类型,delete标示的是该字段是否被删除。除此之外,我们还需要知道记录头信息里面的另外一个字段n_owned,这个字段保存的是改组内一共有多少个数据记录,在上述删除的操作中,最大记录中该字段的变化过程如下:

关于这个初始值为何是5,后续的文章中我们会说明。至此,我们已经了解到,一个数据页,大概可以描述成如下形式:

本文分享自微信公众号 - DBA随笔(gh_acc2bbc0d447),作者:AsiaYe

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Innodb的B+树索引(1)

    在之前3月17号和4月9号的文章中,我们讲过innodb的数据页结构,如果对下面的内容有什么不理解的话,还请在文章分类中翻看之前的文章,防止大家忘记,这里...

    AsiaYe
  • MySQL中的too many connections错误

    今天中午,开发测试环境的MySQL服务报了一个too many connections的错误,从问题上看,可能是连接池被打满了,导致所有的连接都不可用了。

    AsiaYe
  • Innodb数据页简介

    Innodb存储引擎在读取一条数据的时候,是将数据记录从磁盘中取出来,然后在内存中进行处理的,当我们写入一条数据时,是将内存中的数据进行修改,然后再刷新...

    AsiaYe
  • mac下环境变量、maven3.1.1 及 jdk1.7.0.45配置

    一、设置环境变量 1、打开终端,输入 cd ~ 2、输入 touch .bash_profile (如果该文件不存在,将创建一个空文件) 3、输入 open ....

    菩提树下的杨过
  • 微信小程序云开发 初学者入门教程二

    如何操作数据库,作为一名前端,如果对数据的知识不够熟悉也没关系,从现在开始好好学习就行,数据库的操作内容差不多涉及增删改查四大模块,花一些业余的时间在上面,也必...

    祈澈菇凉
  • 老男孩Python全栈开发(92天全)视频教程 自学笔记03

    玩蛇的胖纸
  • C# 实现的Javascript加密算法

    不打算公开的,不过转念一想,反正又没人看,就发出来吧。 这是使用C#来实现的JS加密的,被加密的JS文件,代码需要写的规范,不能少了分号(;)等js中可能会被忽...

    徐大嘴
  • Google的Sawzall,Yahoo的Pig和微软的Dryad

    Greg 最近写了篇介绍Google,Yahoo,微软三大巨头公司分布式架构的Blog。这就是:Google的Sawzall,Yahoo的Pig 猪和微软...

    田春峰-JCJC错别字检测
  • 一文理解JVM(内存、垃圾回收、性能优化)解决面试中遇到问题

    Java堆是java虚拟机所管理内存中最大的一块内存空间,处于物理上不连续的内存空间,只要逻辑连续即可,主要用于存放各种类的实例对象。该区域被所有线程共享,在虚...

    lyb-geek
  • 把Faster-RCNN的原理和实现阐述得非常清楚

    这篇文章把Faster R-CNN的原理和实现阐述得非常清楚,于是我在读的时候顺便把他翻译成了中文。

    机器学习AI算法工程

扫码关注云+社区

领取腾讯云代金券