中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解MySQL中的page頁

發布時間:2021-10-09 15:30:41 來源:億速云 閱讀:156 作者:iii 欄目:編程語言

這篇文章主要介紹“如何理解MySQL中的page頁”,在日常操作中,相信很多人在如何理解MySQL中的page頁問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何理解MySQL中的page頁”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

如何理解MySQL中的page頁

在介紹InnoDB中的頁的時候,很有必要先讓大家了解一下InnoDB中的存儲結構

如何理解MySQL中的page頁

從InnoDB存儲引擎的邏輯結構看,所有數據都被邏輯地存放在一個空間內,稱為表空間(tablespace),而表空間由段(sengment)、區(extent)、頁(page)組成。在一些文檔中extend又稱塊(block)。

▍一、表空間(table space)


表空間(Tablespace)是一個邏輯容器,表空間存儲的對象是段,在一個表空間中可以有一個或多個段,但是一個段只能屬于一個表空間。數據庫由一個或多個表空間組成,表空間從管理上可以劃分為系統表空間、用戶表空間、撤銷表空間、臨時表空間等。

在 InnoDB 中存在兩種表空間的類型:共享表空間和獨立表空間。如果是共享表空間就意味著多張表共用一個表空間。如果是獨立表空間,就意味著每張表有一個獨立的表空間,也就是數據和索引信息都會保存在自己的表空間中。獨立的表空間可以在不同的數據庫之間進行遷移。可通過命令

mysql > show variables like 'innodb_file_per_table';

查看當前系統啟用的表空間類型。目前最新版本已經默認啟用獨立表空間。

InnoDB把數據保存在表空間內,表空間可以看作是InnoDB存儲引擎邏輯結構的最高層。本質上是一個由一個或多個磁盤文件組成的虛擬文件系統。InnoDB用表空間并不只是存儲表和索引,還保存了回滾段、雙寫緩沖區等。

▍二、段(segment)


段(Segment)由一個或多個區組成,區在文件系統是一個連續分配的空間(在 InnoDB 中是連續的 64 個頁),不過在段中不要求區與區之間是相鄰的。段是數據庫中的分配單位,不同類型的數據庫對象以不同的段形式存在。當我們創建數據表、索引的時候,就會相應創建對應的段,比如創建一張表時會創建一個表段,創建一個索引時會創建一個索引段。

▍三、區(extent)


在 InnoDB 存儲引擎中,一個區會分配 64 個連續的頁。因為 InnoDB 中的頁大小默認是 16KB,所以一個區的大小是 64*16KB=1MB。在任何情況下每個區大小都為1MB,為了保證頁的連續性,InnoDB存儲引擎每次從磁盤一次申請4-5個區。默認情況下,InnoDB存儲引擎的頁大小為16KB,即一個區中有64個連續的頁。

▍四、頁(Page)


頁是InnoDB存儲引擎磁盤管理的最小單位,每個頁默認16KB;InnoDB存儲引擎從1.2.x版本礙事,可以通過參數innodb_page_size將頁的大小設置為4K、8K、16K。若設置完成,則所有表中頁的大小都為innodb_page_size,不可以再次對其進行修改,除非通過mysqldump導入和導出操作來產生新的庫。

innoDB存儲引擎中,常見的頁類型有:

1. 數據頁(B-tree Node)

2. undo頁(undo Log Page)

3. 系統頁 (System Page)

4. 事物數據頁 (Transaction System Page)

5. 插入緩沖位圖頁(Insert Buffer Bitmap)

6. 插入緩沖空閑列表頁(Insert Buffer Free List)

7. 未壓縮的二進制大對象頁(Uncompressed BLOB Page)

8. 壓縮的二進制大對象頁 (compressed BLOB Page)

▍五、行(row)


InnoDB存儲引擎是按行進行存放的,每個頁存放的行記錄也是有硬性定義的,最多允許存放16KB/2-200,即7992行記錄。

了解了整體架構,下面我們開始詳細對Page來做一些介紹。

先貼一張Page完整的結構圖

如何理解MySQL中的page頁

上較的概念實在太多了,為了方便理解,可以按下面的分解一下Page的結構

如何理解MySQL中的page頁

每部分的意義

如何理解MySQL中的page頁

如何理解MySQL中的page頁

頁結構整體上可以分為三大部分,分別為通用部分(文件頭、文件尾)、存儲記錄空間、索引部分。

第一部分通用部分,主要指文件頭和文件尾,將頁的內容進行封裝,通過文件頭和文件尾校驗的CheckSum方式來確保頁的傳輸是完整的。

在文件頭中有兩個字段,分別是 FIL_PAGE_PREV 和 FIL_PAGE_NEXT,它們的作用相當于指針,分別指向上一個數據頁和下一個數據頁。連接起來的頁相當于一個雙向的鏈表,如下圖所示:

如何理解MySQL中的page頁

需要說明的是采用鏈表的結構讓數據頁之間不需要是物理上的連續,而是邏輯上的連續。

第二個部分是記錄部分,頁的主要作用是存儲記錄,所以“最小和最大記錄”和“用戶記錄”部分占了頁結構的主要空間。另外空閑空間是個靈活的部分,當有新的記錄插入時,會從空閑空間中進行分配用于存儲新記錄,如下圖所示:

如何理解MySQL中的page頁

一個頁內必須存儲2行記錄,否則就不是B+tree,而是鏈表了。

第三部分是索引部分,這部分重點指的是頁目錄(示意圖2中的s0-sn),它起到了記錄的索引作用,因為在頁中,記錄是以單向鏈表的形式進行存儲的。單向鏈表的特點就是插入、刪除非常方便,但是檢索效率不高,最差的情況下需要遍歷鏈表上的所有節點才能完成檢索,因此在頁目錄中提供了二分查找的方式,用來提高記錄的檢索效率。這個過程就好比是給記錄創建了一個目錄:

將所有的記錄分成幾個組,這些記錄包括最小記錄和最大記錄,但不包括標記為“已刪除”的記錄。
第 1 組,也就是最小記錄所在的分組只有 1 個記錄;
最后一組,就是最大記錄所在的分組,會有 1-8 條記錄;
其余的組記錄數量在 4-8 條之間。
這樣做的好處是,除了第 1 組(最小記錄所在組)以外,其余組的記錄數會盡量平分。
在每個組中最后一條記錄的頭信息中會存儲該組一共有多少條記錄,作為 n_owned 字段。
頁目錄用來存儲每組最后一條記錄的地址偏移量,這些地址偏移量會按照先后順序存儲起來,每組的地址偏移量也被稱之為槽(slot),每個槽相當于指針指向了不同組的最后一個記錄。如下圖所示:

如何理解MySQL中的page頁

頁目錄存儲的是槽,槽相當于分組記錄的索引。我們通過槽查找記錄,實際上就是在做二分查找。這里我以上面的圖示進行舉例,5 個槽的編號分別為 0,1,2,3,4,我想查找主鍵為 9 的用戶記錄,我們初始化查找的槽的下限編號,設置為 low=0,然后設置查找的槽的上限編號 high=4,然后采用二分查找法進行查找。

首先找到槽的中間位置 p=(low+high)/2=(0+4)/2=2,這時我們取編號為 2 的槽對應的分組記錄中最大的記錄,取出關鍵字為 8。因為 9 大于 8,所以應該會在槽編號為 (p,high] 的范圍進行查找

接著重新計算中間位置 p’=(p+high)/2=(2+4)/2=3,我們查找編號為 3 的槽對應的分組記錄中最大的記錄,取出關鍵字為 12。因為 9 小于 12,所以應該在槽 3 中進行查找。

遍歷槽 3 中的所有記錄,找到關鍵字為 9 的記錄,取出該條記錄的信息即為我們想要查找的內容。

B+ 樹是如何進行記錄檢索的?

如果通過 B+ 樹的索引查詢行記錄,首先是從 B+ 樹的根開始,逐層檢索,直到找到葉子節點,也就是找到對應的數據頁為止,將數據頁加載到內存中,頁目錄中的槽(slot)采用二分查找的方式先找到一個粗略的記錄分組,然后再在分組中通過鏈表遍歷的方式查找記錄。

到此,關于“如何理解MySQL中的page頁”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巴楚县| 崇义县| 德州市| 香河县| 靖宇县| 托克逊县| 前郭尔| 澳门| 偃师市| 余姚市| 根河市| 云阳县| 凤山县| 万荣县| 汕尾市| 永济市| 宁明县| 靖州| 台安县| 遂宁市| 张北县| 建瓯市| 临洮县| 固安县| 库伦旗| 滕州市| 京山县| 海丰县| 上林县| 浦县| 唐河县| 遂平县| 张家港市| 吴江市| 阜新市| 南开区| 织金县| 冷水江市| 五莲县| 横峰县| 彰武县|