30 用于存放磁盤上的多行數(shù)據(jù)的數(shù)據(jù)頁到底長個什么樣子?

用于存放磁盤上的多行數(shù)據(jù)的數(shù)據(jù)頁到底長個什么樣子?
之前我們老是給大家提到一個概念,就是數(shù)據(jù)頁,大家都知道平時我們執(zhí)行crud的時候,都會從磁盤上加載數(shù)據(jù)頁到Buffer Pool的緩存頁里去,然后更新了緩存頁后,又會刷新回磁盤上的數(shù)據(jù)頁里去。
所以其實MySQL中進行數(shù)據(jù)操作的最小單位應該是數(shù)據(jù)頁,那么我們之前已經給大家分析過了一行一行的數(shù)據(jù)在磁盤和緩存中存儲的時候,他真正的格式是什么樣子的
現(xiàn)在我們都知道,一行一行的數(shù)據(jù)是放在數(shù)據(jù)頁里的,所以接下來就該分析分析,數(shù)據(jù)頁到底是長什么樣子的了。
之前介紹過,每個數(shù)據(jù)頁,實際上是默認有16kb的大小,那么這16kb的大小就是存放大量的數(shù)據(jù)行嗎?
明顯不是的,其實一個數(shù)據(jù)頁拆分成了很多個部分,大體上來說包含了文件頭、數(shù)據(jù)頁頭、最小記錄和最大記錄、多個數(shù)據(jù)行、空閑空間、數(shù)據(jù)頁目錄、文件尾部。
我下面有一個圖,在圖里包含了一個數(shù)據(jù)頁的各個部分,大家可以看一下

其中文件頭占據(jù)了38個字節(jié),數(shù)據(jù)頁頭占據(jù)了56個字節(jié),最大記錄和最小記錄占據(jù)了26個字節(jié),數(shù)據(jù)行區(qū)域的大小是不固定的,空閑區(qū)域的大小也是不固定的,數(shù)據(jù)頁目錄的大小也是不固定的,然后文件尾部占據(jù)8個字節(jié)。
看完了這個數(shù)據(jù)頁的結構,是不是覺得很神奇?居然冒出了這么多稀奇古怪的概念出來。
其實也沒什么好奇怪的,說白了,這個數(shù)據(jù)頁就跟每一行數(shù)據(jù)一樣,都是由MySQL開發(fā)人員設計出來的一個特殊的存儲格式。
也就是說通過這種特殊的存儲格式在磁盤文件里去存放一個又一個的數(shù)據(jù)頁,每個數(shù)據(jù)頁在磁盤里實際存儲的時候,就是包含了上述一些特殊的數(shù)據(jù),然后每個數(shù)據(jù)頁里還有專門的區(qū)域包含了多個數(shù)據(jù)行,至于每個數(shù)據(jù)行,那就是用我們之前講解的那套存儲格式來存儲的了。
接著我們給大家講一下這個把數(shù)據(jù)插入數(shù)據(jù)頁的一個過程,因為大家都知道,剛開始一個數(shù)據(jù)頁可能是空的,沒有一行數(shù)據(jù)的,此時這個數(shù)據(jù)頁實際上是沒有數(shù)據(jù)行那個區(qū)域的
也就是說,此時看起來一個空的數(shù)據(jù)頁就是下面圖里那樣的。
? ? ? ? ? ?

然后我們來思考一下,假設我們現(xiàn)在要插入一行數(shù)據(jù),此時數(shù)據(jù)庫里可是一行數(shù)據(jù)都沒有的,那么此時是不是應該先是從磁盤上加載一個空的數(shù)據(jù)頁到緩存頁里去?
此時空的數(shù)據(jù)頁就是如上圖所示,至于加載的過程,則如下圖所示。
? ? ? ? ? ?

? ? ? ? ? ? ?
接著我們是不是應該在Buffer Pool中的一個空的緩存頁里插入一條數(shù)據(jù)?
記住,緩存頁跟數(shù)據(jù)頁是一 一對應的,他在磁盤上的時候就是數(shù)據(jù)頁,數(shù)據(jù)頁加載到緩存頁里了,我們就叫他緩存頁了!
所以此時在緩存頁里插入一條數(shù)據(jù),實際上就是在數(shù)據(jù)行那個區(qū)域里插入一行數(shù)據(jù),然后空閑區(qū)域的空間會減少一些,此時當緩存頁里插入了一行數(shù)據(jù)之后,其實緩存頁此時看起來如下圖所示。
? ? ? ? ? ?

接著你就可以不停的插入數(shù)據(jù)到這個緩存頁里去,直到他的空閑區(qū)域都耗盡了,就是這個頁滿了,此時數(shù)據(jù)行區(qū)域內可能有很多行數(shù)據(jù),如下圖所示,空閑區(qū)域就沒了。
? ? ? ? ? ?

而且大家都知道,在更新緩存頁的同時,其實他在lru鏈表里的位置會不停的變動,而且肯定會在flush鏈表里,所以最終他一定會通過后臺IO線程根據(jù)lru鏈表和flush鏈表,把這個臟的緩存頁刷到磁盤上去,如下圖所示。
? ? ? ? ? ?

因此對于數(shù)據(jù)頁的整體存儲結構的初步介紹,以及MySQL實際運行過程中,數(shù)據(jù)頁的使用,我們今天就介紹完了,接下來我們會繼續(xù)去了解表空間、數(shù)據(jù)區(qū)、數(shù)據(jù)段這些物理存儲中的概念。
End
專欄版權歸公眾號儒猿技術窩所有
未經許可不得傳播,如有侵權將追究法律責任