mysql 頁 MySQL資料結構 頁結構

2021-10-25 22:26:38 字數 1465 閱讀 9890

innodb設計了多種頁結構用於存放不同型別的資料,我們現在主要研究存放資料的頁,稱為索引頁或資料頁。

每個頁由七部分組成,大致功能如下:

fileheader 檔案頭:記錄頁的通用資訊,比如上下頁的頁號,頁型別,所有的資料頁其實是乙個雙鏈表

pageheader 頁頭:記錄本頁儲存記錄的狀態資訊,比如本頁記錄數量,槽數量

infimum + supremum 最小與最大記錄,是虛擬記錄

user records 真正存資料的地方:以鍊錶的形式儲存一條條行記錄

free space 存資料空間中尚未使用的區域

page directory 頁目錄:頁中某些記錄的相對位置,用於提公升查詢效率

file trailer 檔案尾:刷盤時校驗頁是否完整

其中user records和page directory是我們的主要研究目標。

user records

其實從一開始是沒有user records這個空間的。當插入第一條資料的時候,會從free space空間分配出乙個空間到user records,直到插入最後一條記錄將free space的空間全部用完就會再去申請乙個新的頁。

user records是用來儲存資料的地方,簡單來說就是怎麼把每行資料擺在這個空間裡。

行格式的資料結構中的記錄頭資訊在擺放資料的過程中發揮了重要作用,我們來回顧一下記錄頭資訊的各個屬性。:

delete_mask 標記該記錄是否被刪除

n_owned 如果當前記錄是組內最大記錄,則代表槽內的記錄數

heap_no 當前記錄在本頁中的位置資訊

record_type 表示當前記錄的型別

0表示普通記錄,1表示b+樹非葉子節點記錄,2表示最小記錄,3表示最大記錄

我們發現有乙個next_record記錄了當前記錄到下乙個記錄的地位址偏移量,也就是說我們知道了當前記錄的位置就可以找到下乙個記錄。所以說,整個user record空間是乙個單鏈表。鍊錶中的各個節點是按照主鍵值從小到大的順序連線起來的。

page directory

現在有乙個問題,我們要在乙個頁中查詢指定的一條記錄。除了從頭遍歷還有更高效率的方法麼?page directory提供了解決方案。

innodb會將乙個頁中的所有記錄劃分成若干個組,每組4-8個記錄。將每個組最後乙個記錄相對於第乙個記錄的位址偏移量(可以定位到真實資料記錄)提取出來存放在頁中乙個叫做page directory的陣列中,陣列中的元素就是這些位址偏移量,也稱為槽(slot)。所以page directory就是由槽組成的。

所以在乙個頁中根據主鍵查詢記錄是很快的,步驟為:

二分法確定該記錄所在的槽,並找到該槽所在分組中主鍵值最小的那條記錄。

通過next_record屬性遍歷單鏈表找到記錄

二分法:只適用於陣列。

鍊錶是順序訪問,不是隨機訪問,用二分查詢並不能提高查詢效率,因為你每次還得從第乙個結點出發,找到指標low,high,middle所指的元素,所以一般不在鍊錶內使用二分查詢。

mysql 資料結構 Mysql索引資料結構

mysql索引資料結構 當慢查詢時,看sql是否走索引。索引的本質 索引是幫助mysql高效獲取資料的排好序的資料結構。mysql若不建立索引,查詢某條資料時則會逐行掃瞄,每掃瞄一行資料就會做一次磁碟io。b tree 葉節點具有相同的深度,葉節點的指標為空。所有索引元素不重複。葉節點中的資料索引從...

mysql資料結構

在剛才新建表的過程中,我們提到了資料型別,mysql 的資料型別和其他程式語言大同小異,下表是一些 mysql 常用資料型別 整數型 整數除了 int 外,還有 tinyint smallint mediumint bigint。字元型 char 和 varchar 的區別 char 的長度是固定的...

MySQL三維資料結構 MySQL資料結構

索引 索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。是一種單獨的 物理的對資料庫表中一列或多列的值進行排序的一種儲存結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單。mysql索引的資料結構是b 樹,mongod...