[TOC]
1. 數(shù)據(jù)頁的物理結(jié)構(gòu)
數(shù)據(jù)頁是一個(gè)非常重要的概念臂痕,那在磁盤中是如何存儲一個(gè)一個(gè)的數(shù)據(jù)頁?
大量的數(shù)據(jù)頁是按順序一頁一頁存放的兼雄,然后兩兩相鄰的數(shù)據(jù)頁之間會采取雙向鏈表的格式互相引用姻僧。
在磁盤文件里就是一段數(shù)據(jù)甫匹,大概類似為:
然后每一個(gè)數(shù)據(jù)頁會存儲一行一行的數(shù)據(jù),也就是平時(shí)我們在表里插入的一行一行的數(shù)據(jù)就會存儲在數(shù)據(jù)頁里蓝牲,數(shù)據(jù)頁里的每一行數(shù)據(jù)都是依照主鍵大小進(jìn)行排序存儲趟脂。同時(shí)每一行數(shù)據(jù)都會有指針指向下一行數(shù)據(jù)的位置,組成單向鏈表例衍。
2. 沒有索引的前提下昔期,數(shù)據(jù)庫如何根據(jù)查詢語句搜索數(shù)據(jù)的?
我們已經(jīng)知道數(shù)據(jù)頁的大概結(jié)構(gòu)佛玄,其實(shí)每個(gè)數(shù)據(jù)頁里還會有一個(gè)頁目錄硼一。
頁目錄里面是根據(jù)數(shù)據(jù)行主鍵存放的一個(gè)目錄。同時(shí)數(shù)據(jù)行被分散存儲到不同的槽位里面梦抢,所以般贼,實(shí)際上每個(gè)數(shù)據(jù)頁的目錄里,就是這個(gè)頁里面每個(gè)主鍵跟所在槽位的映射關(guān)系奥吩。
注意哼蛆,槽位里存儲的是多行數(shù)據(jù)行,而不是一行數(shù)據(jù)行圈驼。
假設(shè)現(xiàn)在根據(jù)主鍵查詢一條數(shù)據(jù)人芽,此時(shí)表里的數(shù)據(jù)不多,剛好都在一個(gè)數(shù)據(jù)頁里绩脆。首先把數(shù)據(jù)頁加載到緩存頁中萤厅,再到頁目錄里根據(jù)主鍵進(jìn)行二分查找橄抹,通過比較查詢主鍵和頁目錄主鍵(槽位里的最小主鍵),快速定位數(shù)據(jù)行所在的槽位惕味,然后到槽位里遍歷每一行數(shù)據(jù)楼誓,快速找到該主鍵對應(yīng)的數(shù)據(jù)。
如果是非主鍵查詢名挥,沒辦法根據(jù)主鍵去頁目錄進(jìn)行二分法查找疟羹,則需要根據(jù)數(shù)據(jù)頁的雙向鏈表不停查找,導(dǎo)致全表掃面禀倔,效率非常低下榄融。
3. 不斷在表中插入數(shù)據(jù)時(shí),物理存儲是如何進(jìn)行頁分裂
首先我們了解到插入的數(shù)據(jù)救湖,會進(jìn)入數(shù)據(jù)頁的內(nèi)部愧杯,他們會組成一個(gè)單向鏈表,大概的結(jié)構(gòu)如下:
行類型為2鞋既,證明就是最小一行力九,普通數(shù)據(jù)行的類型為0,最大數(shù)據(jù)行類型為3邑闺。
當(dāng)數(shù)據(jù)越來越多跌前,一個(gè)數(shù)據(jù)頁放不下了,就會再搞一個(gè)新的數(shù)據(jù)頁來存放陡舅,組成一個(gè)雙向鏈表抵乓。
索引運(yùn)作的核心基礎(chǔ)是,要求后面的數(shù)據(jù)頁的主鍵大于前面數(shù)據(jù)頁的主鍵蹭沛。如果插入數(shù)據(jù)的主鍵是自增的臂寝,那這個(gè)很好保證。
如果不是自增的摊灭,就有可能出現(xiàn)后數(shù)據(jù)頁的主鍵小于前數(shù)據(jù)頁的主鍵值咆贬。
此時(shí)就會出現(xiàn)一個(gè)頁分裂
的過程。簡單來講帚呼,就是如果發(fā)現(xiàn)插入后數(shù)據(jù)頁的主鍵值比前數(shù)據(jù)頁的主鍵值要小掏缎,就會把主鍵值大的數(shù)據(jù)行以到新的數(shù)據(jù)頁,把新插入的主鍵值較小的移到上一個(gè)數(shù)據(jù)頁煤杀。
移動前:
移動后:
這樣的一個(gè)過程就是 頁分裂眷蜈。
注明:
學(xué)習(xí)筆記總結(jié)于公棕號:儒猿技術(shù)窩。感興趣的同學(xué)可以前往關(guān)注沈自。