原创 MySql数据是如何存储在磁盘上存储的?

发布时间:2021-08-03 23:54:05 浏览 760 来源:猿笔记 作者:HollisChuang

    里面保存的数据最终都是要持久化到磁盘文件上面的,磁盘文件里存放的物理格式就是数据页(关于数据页?但是对于数据页中的每一行数据他又是怎么存储的呢,InnoDB存取过程记录的中间状态,是InnoDB在内存中存储的格式(换句话说我们的增删改的操作都是在内存中执行的,记录在物理页面中的存储格式,(这个是数据在磁盘存储的真正的格式),MySql的InnoDB存储引擎和大多数数据库一样。都是以行的形式存储数据的,我们可以通过`SHOWTABLESTATUS`查看到行的的存储格式,其实在存储的时候都会有一些都字段来描述这一行的信息。


    [GitHub19kStar的Java工程师成神之路,不来了解一下吗!](

    [GitHub19kStar的Java工程师成神之路,真的不来了解一下吗!](

    [GitHub19kStar的Java工程师成神之路,真的真的不来了解一下吗!](

    相信很多人都很熟悉MySql数据库,这是最常用的关系数据库,关于MySql的知识也很丰富。

    所以,不知道大家有没有想过这个问题:MySql中的数据存在于哪里?又是怎么储存的?

    ##Innodb的存储格式

    正如我们所知,对于Mysql,一个关系数据库,存储在其中的数据最终将被保存到磁盘文件中。存储在磁盘文件中的物理格式是数据页(如果不理解数据页,先忽略它,在后面的文章中单独介绍)。数据页逐行存储记录,但是他是如何在数据页中存储每行数据的呢?

    下面重点介绍一下Mysql中最常用的Innodb引擎,以及存储格式。

    MySQL中存储有3种:

    1 .服务器层格式:独立于存储引擎,常用BinLog存储(我们之前已经详细介绍过Binlog,这是MySql主从复制的一个非常重要的文件)

    2.索引元组格式:InnoDB访问过程中记录的中间状态是InnoDB存储在内存中的格式(换句话说,我们的添加、删除和修改操作都是在内存中进行的,只是一种临时状态)

    3.物理存储格式:物理页面中记录的存储格式,即紧凑格式,与索引元组格式一一对应。(这是存储在磁盘上的数据的真实格式)

    MySql的InnoDB存储引擎和大多数数据库一样,以行的形式存储数据,我们可以通过SHOWTABLESTATUS '来查看行的存储格式。

    InnoDB储存引擎支持有四种行储存格式:COMPACT、Redundant、Dynamic和COMPRESSED。默认为COMPACT。

    ![image-56093][1]

    ![image-33395][2]

    对于我们看到的每一行数据,似乎首先看到的不是每一列,而是一些类似于列的描述信息。是的,其实存储的时候总会有一些字段来描述这一行的信息,类似于描述缓存池中缓存页的描述数据。

    ![image-49094][3]

    ###变长字段varchar是如何存储的

    一般来说,我们要存储的数据不能确定其长度,但大多数情况下,它是可变长度的数据。以' varchar '为例,假设有三个字段,字段类型分别为:` varchar (10),char (1),char (1),` char '。大家都知道它基本上是存储一些已知的固定长度的数据。

    第一行:` MySQL ` a ` a `;` ` a `;第二行:` dog ' `b ' `c画一张图帮助人们想象,你现在看到的就是数据给我们展示的。

    ![image-30975][4]

    但在磁盘上却不是这样。前面说过,表空间和行实际上是逻辑概念,而数据页是物理概念,这意味着我们在磁盘上看到的是不同的。

    在磁盘上,这两个记录大致是这样的:` MySQL ` a ` a ` dog ` b ` c `,它们都是紧挨着存储在磁盘上的。

    是不是突然觉得找一条数据很麻烦?我告诉你:是的,所以` MySQL '在设计的时候会用行格式存储,会有之前的变长字段列表,标志位,记录信息。这些是用来记录一行记录的信息。换句话说,“MySQL”通过这些描述信息在一行中定位特定的记录。

    以第一行的记录为例。它在磁盘上的记录大致如下。首先,我们需要清楚地知道MySql的每个字段的类型都非常清楚。在此基础上,我们可以理解以下,理解以下的事情。首先我们看到‘MySQL’是5个字符,十六进制是0x05,所以它的存储看起来是这样的:

    ![image-25946][5]

    同样,第二行中的数据类似于:

    ![image-16645][6]

    相信大家大概都能猜到此时‘MySQL’是如何读取数据的,也就是他会先根据变长字段长度列表中描述的变长字段的信息来寻找变长字段。例如,在第一行,“MySql”解析出可变长度字段为5,因此他将在“mysql”中去掉5个字符“a”“a”“狗”“b”“c”

    由浅入深,慢慢来。我刚才说的只是一个很简单的情况。这是为了帮助大家理解,让大家明白有这么个东西,就是这么回事,然后慢慢挖,一定要一个萝卜一个坑地好好学习,

    现在如果是多个`varchar`类型的字段怎么办?例如:`varchar(3),varchar(10),varchar(4),char(1)`,他有一条记录是这样子的:`aaa`,`bb`,`cccc`,`d`,你根据上面的能推测出磁盘中的行记录是怎么样子的吗?

    你这么认为:磁盘一定是这样的:` 0x03,0x02,0x04 `空标志位记录头信息` AAA ` bb ` cccc ` d `;这么想的同学请把鼻子靠在墙上:;其实不是这样的。

    当有多个变长字段时,` MySql '在行记录的开头存储所有变长类型的长度,形成一个列表(这个列表就是上面刚提到的变长字段列表),* *按照列的逆序存储* *。

作者信息

HollisChuang [等级:3] Developer
发布了 314 篇专栏 · 获得点赞 22151 · 获得阅读 1036458

相关推荐 更多