数据在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