MySQL:24 一行数据中的多个NULL字段值在磁盘上怎么存储
Posted 鮀城小帅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL:24 一行数据中的多个NULL字段值在磁盘上怎么存储相关的知识,希望对你有一定的参考价值。
1. 一行数据里的NULL值不能直接存储
在磁盘上存储的一行数据里有另一块特殊的数据区域,就是NULL值列表。
这个所谓的NULL值列表,顾名思义,说的就是一行数据里可能有的字段值是NULL,比如有一个name字段,它是允许为NULL的,那么实际上在存储的时候,如果你没给它赋值,它这个字段的值就是NULL。
由于它是个NULL,说明什么值都没有。实际上在磁盘上存储数据的时候,一行数据里的NULL值是肯定不会直接按照字符串的方式存放在磁盘上浪费空间的。
2. NULL值是以二进制bit位来存储的
一个表中的所有NULL值,不通过字符串在磁盘上存储,而是通过二进制的bit位来存储,一行数据里假设有多个字段的值都是NULL,那么这多个字段的NULL,就会以bit的形式存储在NULL值列表中。
假设当前有个表,有5个字段:name address gender job school ,其中的gender是CHAR(1),其他的是VARCHAR(10~50不等)的字段类型,而除了第一个字段声明了NOT NULL的,其他4个字段都可能是NULL。
如果该表有一行数据存储到磁盘的话,举例来说它的格式是: “jack NULL m NULL xx_school”,它的字段里有两个字段都是NULL。
3.结合案例来思考一行数据的磁盘存储格式
前面说过,一行数据在磁盘上的存储格式应该是下面这样的:
变长字段长度列表 NULL值列表 头信息 column1=value1 column2=value2 ... columnN=valueN
如果该表有一行数据存储到磁盘的话,举例来说它的格式是: “jack NULL m NULL xx_school”,它的字段里有两个字段都是NULL。
只有name和school两个变长字段是有值的,把他们的长度按照逆序放在变长字段长度列表中就可以了,如下所示:
0x09 0x04 NULL值列表 头信息 column1=value1 column2=value2 ... columnN=valueN
接着来看NULL值列表,这个NULL值列表是这样存放的,所有允许值为NULL的字段。只要是允许你为NULL的字段,在这里每个字段都有一个二进制bit位的值,如果bit值是1说明是NULL,如果bit值是0说明不是NULL。
以上面的例子,也就是一行数据的值是 “jack NULL m NULL xx_school” 来说,他这里有四个变长字段,其中2个字段是null,2个字段不是null,所以4个bit位应该是: 1010。
由于实际放在NULL值列表的时候,是按逆序放的,所以在NULL值列表里,放的是: 0101,整体这一行数据看着是下面这样的:
0x09 0x04 0101 头信息 column1=value1 column2=value2 ... columnN=valueN
另外由于它实际NULL值列表存放的时候,不会仅仅是4个bit位,一般起码是8个bit位的倍数,如果不足8个bit位就高位补0,所以实际存放看起来是如下的:
0x09 0x04 00000101 头信息 column1=value1 column2=value2 ... columnN=valueN
4.磁盘上的一行数据是如何读取出来的?
在上面的原理分析中,一行数据的磁盘数据存储格式如下:
0x09 0x04 00000101 头信息 column1=value1 column2=value2 ... columnN=valueN
那么如果想要将他从磁盘上读取出来。
首先要把变长字段长度列表和NULL值列表读取出来,通过综合分析一下,就知道有几个变长字段,哪几个变长字段是NULL,因为NULL值列表里谁不是NULL都一清二楚。
如果是变长字段的值,就按照他的值长度来读取,如果是NULL,就知道它是个NULL,没有值存储,如果是定长字段,就按照定长长度来读取,这样就可以完美的把一行数据的值都读取出来了。
以上是关于MySQL:24 一行数据中的多个NULL字段值在磁盘上怎么存储的主要内容,如果未能解决你的问题,请参考以下文章