<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
InnoDB 是 mysql 的預設引擎,也是我們最常用的,所以基於 InnoDB,學習頁結構。而學習頁結構,是為了更好的學習索引。
頁是 InnoDB 管理儲存空間的基本單位,一個頁的大小一般是 16kb。
為了達成不同的目的,作者設計了多種型別的頁,比如:
然而我們最關心的,還是那些存放進表中那些資料記錄是在哪種頁上,官方稱這種存放記錄的頁為索引(INDEX)頁,但是為了便於理解,本篇暫把它稱為資料頁。
這資料頁也有 16kb 的儲存空間,可以大致劃分為 7 個部分。
從結構圖中可以看到,有些部分的佔用位元組數是確定的,有的是不確定的。我們最關心的使用者儲存的記錄,在 User Records部分。
不過,在一開始生成頁的時候,並沒有 User Records 部分。當有新的記錄插入時,就會從 Free Space部分申請一個記錄大小的空間,然後劃分到 User Records 部分,直到 Free Space 全部被 User Records 替代,表示這個頁已經用完。如果還有新的記錄插入,需要申請新的頁。
我覺得這裡可以把這個資料頁當作是書本的頁,書頁上的內容通常是一行行的呈現,當整個頁都用完了,就得翻到下一頁(新頁)去繼續寫了。
那麼,User Records 部分裡的這些記錄,是如何管理的呢?
先來建一張表:
CREATE TABLE pingguo_demo( c1 INT, c2 INT, c3 VARCHAR(10000), PRIMARY KEY (c1) ) CHARSET = ASCII ROW_FORMAT = COMPACT;
這裡的指定使用行格式為 COMPACT(引擎中還存在其他的行格式),暫且知道 COMPACT 即可。
當我們在資料庫的插入了一條記錄後,其實背後的行格式是這樣的:
注意這裡橙色標識的記錄頭資訊,它又包含了很多重要資訊:
現在,向上面新建的表中插入 4 條記錄:
INSERT INTO pingguo_demo VALUES (1, 100, 'aaaa'), (2, 200, 'bbbb'), (3, 300, 'cccc'), (4, 400, 'dddd');
那麼,對應這4條記錄的行格式應該為:
注意,這裡為了便於記憶,作了簡化。另外,記錄中的資訊實際是二進位制位資料,這裡為了理解寫的是十進位制。而且,各條記錄在 User Records 中儲存是沒有空隙的,這裡抽象表示。
這個屬性用來標記當前記錄是否被刪除,1 表示被刪除,0 表示沒有被刪除。
嗯?我表裡刪除了資料居然還在頁裡。
是的,你以為被刪除了,其實還在磁碟上。為什麼呢?
因為如果在磁碟上移除這些記錄,還要再重新排列其他記錄,會帶來效能消耗,所以只打了一個刪除的標記。
然後,所有的刪除的記錄會組成一個垃圾連結串列。而記錄在這個連結串列中所佔用的空間稱為可重用空間,當後面有新記錄插入到表中,它們就可能覆蓋掉這些空間。
在 B+ 樹中每層非葉子節點中的最小的目錄項,都會新增此標記。這裡說的目錄項,要後續講解。
這裡4條記錄的 min_rec_flag 都是 0,表示都不是 B+ 樹非葉子節點中的最小的目錄項記錄。
要下一章講解。
表示當前記錄在頁面堆中的相對位置。
上面的4條記錄是抽象的描述,實際上這些記錄都是一條一條緊密無縫排列在一起的,這就是堆(heap)。
為了方便管理,把一條記錄在堆中的相對位置稱為 heap_no。
上述 4 條記錄的 heap_no 分別為 2、3、4、5,嗯?怎麼沒有 0 和 1?
虛擬記錄-Infimum 和 Supremum
這個在本文第二部分有提到過。其實這2條記錄是頁裡自動新增的:
Infimum
:代表頁面中的最小記錄
Supremum
:代表頁面中的最大記錄
作者規定,無論向頁中插入了多少條記錄,任何使用者記錄都比 Infimum 記錄大,都比 Supremum 記錄小。
這 2 條虛擬記錄的結構也很簡單。
所以,對於上面插入的 4 條使用者記錄,還應該加上這2個預設記錄,而且位置最靠前。
另外,還需要注意,當堆中記錄的 heap_no 值分配後,就不會發生改動。即使刪除了堆中的某條記錄,這條被刪記錄的 heap_no 值也仍然不變。
這個屬性表示當前記錄的型別,共 4 種:
0:表示普通記錄1:表示 B+ 樹非葉節點的目錄項記錄2:表示 Infimum 記錄3:表示 Supremum 記錄
這個屬性很重要,表示從當前記錄的真實資料到下一條記錄的真實資料之間的距離。
比如,第 1 條記錄的 next_record 值為 32,那麼從此記錄的真實資料地址向後找 32 位元組就是下一條記錄的真實資料。再比如,當值為 -111,那麼就代表從此記錄向前找 111 位元組。
很熟悉?沒錯,就是連結串列。
所以,現在再來重新看下記錄之間的示意圖,可以用單向連結串列來描述了:
如果這時候,刪掉其中的某條記錄,改變的是指標。
本文參考書籍:《mysql是怎樣執行的》
以上就是Mysql InnoDB引擎中的資料頁結構詳解的詳細內容,更多關於Mysql InnoDB引擎資料頁結構的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45