基于MySQL在磁盤(pán)上存儲(chǔ)NULL值
1 為何不能直接存?zhèn)€NULL?
NULL值列表,一行數(shù)據(jù)里可能有的字段值是NULL,比如nickname字段,允許為NULL,存儲(chǔ)時(shí),如果沒(méi)賦值,這字段值就是NULL。
假設(shè)這個(gè)字段的NULL值在磁盤(pán)存儲(chǔ)時(shí),就是按“NULL”字符串存儲(chǔ)的,是不是很浪費(fèi)存儲(chǔ)空間而且還奇怪?
2 到底怎么存儲(chǔ)?
不通過(guò)字符串,而是通過(guò)二進(jìn)制bit位存儲(chǔ),一行數(shù)據(jù)里假設(shè)有多個(gè)字段的值都是NULL,那么這多個(gè)字段的NULL,就會(huì)以bit位形式存放在NULL值列表。
如下表:
CREATE TABLE customer ( ? name VARCHAR(10) NOT NULL, ? address VARCHAR(20), gender CHAR(1), ? job VARCHAR(30), ? school VARCHAR(50) ) ROW_FORMAT=COMPACT;
有4個(gè)變長(zhǎng)字段,還有個(gè)定長(zhǎng)字段,name
聲明NOT NULL
,其他4個(gè)字段都可能NULL
如下一行數(shù)據(jù)怎么存儲(chǔ)在磁盤(pán)呢:
jack NULL m NULL xx_school
有倆字段都是NULL
3 一行數(shù)據(jù)的磁盤(pán)存儲(chǔ)格式
思考上面那個(gè)表里的那行案例數(shù)據(jù),在磁盤(pán)上如何存儲(chǔ)呢,因?yàn)樗卸鄠€(gè)變長(zhǎng)字段,還有多個(gè)字段允許為NULL。首先我們先回顧一下,一行數(shù)據(jù)在磁盤(pán)上的存儲(chǔ)格式應(yīng)該是下面這樣的:
變長(zhǎng)字段長(zhǎng)度列表 NULL值列表 頭信息 column1=value1 column2=value2 ... columnN=valueN
4個(gè)變長(zhǎng)字段,逆序先放school字段的長(zhǎng)度,再放job、address、name幾個(gè)字段的值長(zhǎng)度?
但要區(qū)分一個(gè)問(wèn)題,若這變長(zhǎng)字段值為NULL,就不用在變長(zhǎng)字段長(zhǎng)度列表里存放他的值長(zhǎng)度,所以在上面那行數(shù)據(jù),只有name和school兩個(gè)變長(zhǎng)字段有值,把他們的長(zhǎng)度按照逆序放在變長(zhǎng)字段長(zhǎng)度列表即可:
0x09 0x04 NULL值列表 頭信息 column1=value1 column2=value2 ... columnN=valueN
所有允許值為NULL的字段,不是說(shuō)值就得是NULL,只要是允許為NULL的字段,每個(gè)字段都有個(gè)二進(jìn)制bit位值:
- bit值是1說(shuō)明是NULL
- bit值是0說(shuō)明不是NULL
比如上面4個(gè)字段都允許為NULL,每個(gè)人都會(huì)有一個(gè)bit位,這一行數(shù)據(jù)的值是
jack NULL m NULL xx_school
其中2個(gè)字段是null,2個(gè)字段不是null,所以4個(gè)bit位應(yīng)該是:1010
但實(shí)際放在NULL值列表時(shí),按逆序放,所以NULL值列表里放的:0101,整體這一行數(shù)據(jù)如下:
0x09 0x04 0101 頭信息 column1=value1 column2=value2 ... columnN=valueN
實(shí)際NULL值列表存放時(shí),一般起碼8個(gè)bit位的倍數(shù),不足8個(gè)bit位就高位補(bǔ)0,所以實(shí)際存放如下:
0x09 0x04 00000101 頭信息 column1=value1 column2=value2 ... columnN=valueN
4 如何讀磁盤(pán)的一行數(shù)據(jù)?
磁盤(pán)數(shù)據(jù)存儲(chǔ)格式:
0x09 0x04 00000101 頭信息 column1=value1 column2=value2 ... columnN=valueN
先讀:
- 變長(zhǎng)字段長(zhǎng)度列表
就知道有幾個(gè)變長(zhǎng)字段
- NULL值列表
哪些變長(zhǎng)字段是NULL:
從變長(zhǎng)字段長(zhǎng)度列表中解析出不為NULL的變長(zhǎng)字段的值長(zhǎng)度,然后也知道哪些字段是NULL。根據(jù)這些信息,就能從實(shí)際的列值存儲(chǔ)區(qū)域里,把你每個(gè)字段的值讀取出來(lái)了。
- 變長(zhǎng)字段值,就按值長(zhǎng)度讀取,若為NULL,就知道他是個(gè)NULL,沒(méi)有值存儲(chǔ)
- 定長(zhǎng)字段,按定長(zhǎng)長(zhǎng)度讀取
到此這篇關(guān)于基于MySQL在磁盤(pán)上存儲(chǔ)NULL值的文章就介紹到這了,更多相關(guān)在磁盤(pán)上存儲(chǔ)NULL值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql數(shù)據(jù)庫(kù)中數(shù)據(jù)表的優(yōu)化、外鍵與三范式用法實(shí)例分析
這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)中數(shù)據(jù)表的優(yōu)化、外鍵與三范式用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Mysql數(shù)據(jù)庫(kù)中數(shù)據(jù)表的優(yōu)化、外鍵與三范式相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2019-11-11mysql 終結(jié)點(diǎn)映射器中沒(méi)有更多的終結(jié)點(diǎn)可用的解決方法
在安裝MySQL的時(shí)候遇到“終結(jié)點(diǎn)映射器中沒(méi)有更多的終結(jié)點(diǎn)可用”提示2009-03-03Mysql如何通過(guò)binlog日志恢復(fù)數(shù)據(jù)詳解
binlog日志用于記錄所有更新了數(shù)據(jù)或者已經(jīng)潛在更新了數(shù)據(jù)的所有語(yǔ)句,下面這篇文章主要給大家介紹了關(guān)于Mysql如何通過(guò)binlog日志恢復(fù)數(shù)據(jù)的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02騰訊面試:一條SQL語(yǔ)句執(zhí)行得很慢的原因有哪些?---不看后悔系列(推薦)
這篇文章主要介紹了SQL語(yǔ)句執(zhí)行慢的原因,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04PHP定時(shí)備份MySQL與mysqldump語(yǔ)法參數(shù)詳解
本文為大家介紹了PHP利用mysqldump命令定時(shí)備份MySQL與mysqldump語(yǔ)法參數(shù)大全以及定時(shí)備份的PHP實(shí)例代碼2018-10-10Mysql InnoDB引擎的索引與存儲(chǔ)結(jié)構(gòu)詳解
這篇文章主要給大家介紹了Mysql InnoDB引擎的索引與存儲(chǔ)結(jié)構(gòu)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01Linux下二進(jìn)制方式安裝mysql5.7版本和系統(tǒng)優(yōu)化的步驟
這篇文章主要介紹了Linux下二進(jìn)制方式安裝mysql5.7版本和系統(tǒng)優(yōu)化的步驟,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01