MySQL进阶之路(八)MySql中的数据是如何被存储的?

数据在MySql中是如何被存储的

概述

​ 众所周知,数据库中的一条记录对应着表中的一行数据。平时我们通过select查询数据的时候也是一次查一行或者多行,只不过有时候可能查的是某几列的数据。

​ 对于InnoDB引擎而言,它有4中行格式,具体的可以查看MySql官网,其实都大同小异。

​ 可通过下面的方式来指定行格式

CREATE TABLE t1 (c1 INT) ROW_FORMAT=COMPACT;

varcha类型的数据是如何存储的

​ 数据库中最常见的就是varchar类型了,它和其他数据类型的最主要区别就是数据长度可变,比如varchar(50)类型的数据存储1个或者50个字符都是可以的。

​ 假如我们在存储的时候给这个类型的数据留50字符的空间,那么势必会造成空间的浪费,因此InnoDB采用的办法用一个变长字段列表来存储变长字段的长度,这样一来,在读数据的时候就可以根据这个列表中对应的长度来读取数据

对于可以为Null的字段该如何存储呢

​ 上面解决了varchar类型数据的存储后,又会面临一个新的问题,如果某些字段可以为null,又该怎么办呢?InnoDB引擎的做法是针对允许为null的字段,专门设置个null值列表来记录一条数据中哪些数据是空的,因为这些字段就只有空和不空两种情况,因此采用的是0和1来表示,1表示为null

小结

​ 理解了上面的内容后,你大概就知道了数据是如何被存储的了。在对某一行数据进行查询的时候,其实就是在查询织一行数据的各个字段,首先会根据null值列表看看哪些字段是非null的,然后就去读取这些不为null的数据,读取的时候如果遇到varchar类型的就会看看变长字段表,根据表中信息就知道该往后读取多少数据。大概就是这样的过程

一行数据存储的格式大致是下面这样的:

变成字段列表 null值列表 数据头 colum1的值 colum2的值 ... columN的值

举例

​ 为了能更好的理解以上的内容,这里举几个例子,比如当前的表的字段如下图所示:

在这里插入图片描述

除了name之外,允许为null的字段有4个,变成字段有4个

假设有这样一行数据:

​ Bob null m null XX_school

那么这行数据可能是这样的:

0x09 0x3 00000101 头信息 colum1=value1 colum2=value2 … columN=valueN

值得一提的是变长字段列表中的顺序是字段的逆序,0x09对应的是xx_school的长度 0x03对应的是Bob的长度,对于null值列表比较容易看出来,也同样是逆序的,因为null值列表最少是8bit,所以,高位就补0

,对于null值列表比较容易看出来,也同样是逆序的,因为null值列表最少是8bit,所以,高位就补0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生命中有太多不确定

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值