29 理解數(shù)據(jù)在磁盤上的物理存儲(chǔ)之后,聊聊行溢出是什么東西?

理解數(shù)據(jù)在磁盤上的物理存儲(chǔ)之后,聊聊行溢出是什么東西?
上一篇文章我們已經(jīng)理解清楚了一行數(shù)據(jù)在磁盤上的物理存儲(chǔ)結(jié)構(gòu)了,其實(shí)理解了這個(gè),你也就理解了每一行數(shù)據(jù)在磁盤上是如何存儲(chǔ)的,以及他被加載到緩存里來的時(shí)候,一行數(shù)據(jù)都包含哪些東西了。
今天我們來聊聊行數(shù)據(jù)的物理存儲(chǔ)的一個(gè)高階的話題,就是行溢出到底是個(gè)什么東西?
我們之前已經(jīng)初步了解到,實(shí)際上我們每一行數(shù)據(jù)都是放在一個(gè)數(shù)據(jù)頁(yè)里的,這個(gè)數(shù)據(jù)頁(yè)默認(rèn)的大小是16KB,那么之前就有人在后臺(tái)提過一個(gè)問題:萬(wàn)一 一行數(shù)據(jù)的大小超過了頁(yè)的大小怎么辦呢?
比如有一個(gè)表的字段類型是VARCHAR(65532),意思就是最大可以包含65532個(gè)字符,那也就是65532個(gè)字節(jié),這就遠(yuǎn)大于16kb的大小了,也就是說這一行數(shù)據(jù)的這個(gè)字段都遠(yuǎn)超一個(gè)數(shù)據(jù)頁(yè)的大小了!
這個(gè)時(shí)候?qū)嶋H上會(huì)在那一頁(yè)里存儲(chǔ)你這行數(shù)據(jù),然后在那個(gè)字段中,僅僅包含他一部分?jǐn)?shù)據(jù),同時(shí)包含一個(gè)20個(gè)字節(jié)的指針,指向了其他的一些數(shù)據(jù)頁(yè),那些數(shù)據(jù)頁(yè)用鏈表串聯(lián)起來,存放這個(gè)VARCHAR(65532)超大字段里的數(shù)據(jù)。
我們看下圖,就給出了這個(gè)示意。

? ? ? ? ? ? ?
上面說的這個(gè)過程,其實(shí)就叫做行溢出,就是說一行數(shù)據(jù)存儲(chǔ)的內(nèi)容太多了,一個(gè)數(shù)據(jù)頁(yè)都放不下了,此時(shí)只能溢出這個(gè)數(shù)據(jù)頁(yè),把數(shù)據(jù)溢出存放到其他數(shù)據(jù)頁(yè)里去,那些數(shù)據(jù)頁(yè)就叫做溢出頁(yè)。
包括其他的一些字段類型都是一樣的,比如TEXT、BLOB這種類型的字段,都有可能出現(xiàn)溢出,然后一行數(shù)據(jù)就會(huì)存儲(chǔ)在多個(gè)數(shù)據(jù)頁(yè)里。
講到這里,其實(shí)就已經(jīng)把我們的行數(shù)據(jù)的物理存儲(chǔ)相關(guān)的內(nèi)容都已經(jīng)講完了,很多瑣碎和細(xì)節(jié)的東西,其實(shí)不需要我們?cè)谶@里來死扣他,大家其實(shí)要理解的,就是一行數(shù)據(jù)的物理存儲(chǔ)結(jié)構(gòu),然后這個(gè)數(shù)據(jù)其實(shí)是在一個(gè)數(shù)據(jù)頁(yè)里的,如果一個(gè)數(shù)據(jù)頁(yè)里放不下一行數(shù)據(jù),就會(huì)有行溢出問題,存放到多個(gè)數(shù)據(jù)頁(yè)里去。
講到這里,我們可以做一點(diǎn)總結(jié),當(dāng)我們?cè)跀?shù)據(jù)庫(kù)里插入一行數(shù)據(jù)的時(shí)候,實(shí)際上是在內(nèi)存里插入一個(gè)有復(fù)雜存儲(chǔ)結(jié)構(gòu)的一行數(shù)據(jù),然后隨著一些條件的發(fā)生,這行數(shù)據(jù)會(huì)被刷到磁盤文件里去。
在磁盤文件里存儲(chǔ)的時(shí)候,這行數(shù)據(jù)也是按照復(fù)雜的存儲(chǔ)結(jié)構(gòu)去存放的。
而且每一行數(shù)據(jù)都是放在數(shù)據(jù)頁(yè)里的,如果一行數(shù)據(jù)太大了,就會(huì)產(chǎn)生行溢出問題,導(dǎo)致一行數(shù)據(jù)溢出到多個(gè)數(shù)據(jù)頁(yè)里去,那么這行數(shù)據(jù)在Buffer Pool可能就是存在于多個(gè)緩存頁(yè)里的,刷入到磁盤的時(shí)候,也是用磁盤上的多個(gè)數(shù)據(jù)頁(yè)來存放這行數(shù)據(jù)的。
希望大家能夠把最近幾天學(xué)到的行數(shù)據(jù)物理存儲(chǔ)結(jié)構(gòu),與之前學(xué)到的Buffer Pool緩存機(jī)制結(jié)合起來去理解,把他們有機(jī)的融合為一體。
接下來,我們就會(huì)開始講解數(shù)據(jù)頁(yè)的物理存儲(chǔ)結(jié)構(gòu),然后是表空間的物理存儲(chǔ)結(jié)構(gòu),最后是講解這些數(shù)據(jù)以物理存儲(chǔ)結(jié)構(gòu)的方式,在磁盤上存儲(chǔ)的時(shí)候,是放在哪些磁盤文件里的。
只要把后續(xù)那些內(nèi)容講完,那么大家就對(duì)數(shù)據(jù)庫(kù)的Buffer Pool緩沖讀寫機(jī)制,以及磁盤上的物理存儲(chǔ)機(jī)制,就完全理解了,而且這兩個(gè)機(jī)制都是有機(jī)結(jié)合在一起的,Buffer Pool的數(shù)據(jù)是從磁盤上讀取出來的,Buffer Pool里更新的數(shù)據(jù)又會(huì)刷新到磁盤上去。
在這個(gè)過程中,整個(gè)數(shù)據(jù)的物理存儲(chǔ)機(jī)制,包括行數(shù)據(jù)、數(shù)據(jù)頁(yè)、表空間、磁盤文件,這些概念,大家也都會(huì)理解了,到時(shí)候自然理解了數(shù)據(jù)在磁盤上如何存儲(chǔ)的,加載到Buffer Pool緩存頁(yè)之后如何存儲(chǔ)的。
End
專欄版權(quán)歸公眾號(hào)儒猿技術(shù)窩所有
未經(jīng)許可不得傳播,如有侵權(quán)將追究法律責(zé)任