MySQL笔记:第07章_InnoDB数据存储结构
第07章_InnoDB數據存儲結構
- 1.數據庫的存儲結構:頁
- 1.1磁盤與內存交互基本單位:頁
- 1.2頁結構概述
- 1.3頁的大小
- 1.4頁的上層結構
- 2.頁的內部結構
- 第1部分:File Header(文件頭部)和File Trailer (文件尾部)
說明:本內容整理自尚硅谷B站MySQL視頻>>尚硅谷B站MySQL視頻
1.數據庫的存儲結構:頁
索引結構給我們提供了高效的索引方式,不過索引信息以及數據記錄都是保存在文件上的,確切說是存儲在頁結構中。另一方面,索引是在存儲引擎中實現的,MySQL服務器上的存儲引擎負責對表中數據的讀取和寫入工作。不同存儲引擎中存放的格式一般是不同的,甚至有的存儲引擎比如Memory都不用磁盤來存儲數據。
由于InnoDB是MySQL的默認存儲引擎,所以本章剖析InnoDB存儲引擎的數據存儲結構。
1.1磁盤與內存交互基本單位:頁
InnoDB將數據劃分為若干個頁,InnoDB中頁的大小默認為 16KB
以頁作為磁盤和內存之間交互的基本單位,也就是一次最少從磁盤中讀取16KB的內容到內存中,一次最少把內存中的16KB內容刷新到磁盤中。也就是說,在數據庫中,不論讀一行,還是讀多行,都是將這些行所在的頁進行加載。也就是說,數據庫管理存儲空間的基本單位是頁(Page),數據庫I/O操作的最小單位是頁。一個頁中可以存儲多個行記錄
記錄是按照行來存儲的,但是數據庫的讀取并不以行為單位,否則一次讀取(也就是一次I/O操作)只能處理一行數據,效率會非常低。
1.2頁結構概述
頁a、頁b、頁c …頁n這些頁可以不在物理結構上相連,只要通過雙向鏈表相關聯即可。每個數據頁中的記錄會按照主鍵值從小到大的順序組成一個單向鏈表,每個數據頁都會為存儲在它里邊的記錄生成一個頁目錄,在通過主鍵查找某條記錄的時候可以在頁目錄中使用二分法快速定位到對應的槽,然后再遍歷該槽對應分組中的記錄即可快速找到指定的記錄。
1.3頁的大小
不同的數據庫管理系統(簡稱DBMS)的頁大小不同。比如在MySQL的InnoDB存儲引擎中,默認頁的大小是16KB,可以通過下面的命令來進行查看:
show variables like '%innodb_page_size%'; /* +------------------+-------+ | Variable_name | Value | +------------------+-------+ | innodb_page_size | 16384 | +------------------+-------+ */SQL Server中頁的大小為 8KB,而在oracle中用術語’‘塊’’(Block)來代表"頁”,Oralce支持的塊大小為2KB,4KB,8KB,16K8,32KB和64KB。
1.4頁的上層結構
另外在數據庫中,還存在區(Extent)、段(Segment)和表空間(Tablespace)的概念。行、頁、區、段、表空間的關系如下圖所示:
區(Extent)是比頁大一級的存儲結構,在InnoDB存儲引擎中,一個區會分配64個連續的頁。因為InnoDB中的頁大小默認是16KB,所以一個區的大小是64*16KB= 1MB。
段(Segment)由一個或多個區組成,區在文件系統是一個連續分配的空間(在InnoDB中是連續的64個頁),不過在段中不要求區與區之間是相鄰的。段是數據庫中的分配單位,不同類型的數據庫對象以不同的段形式存在。當創建數據表、索引的時候,就會相應創建對應的段,比如創建一張表時會創建一個表段,創建一個索引時會創建一個索引段。
表空間(Tablespace)是一個邏輯容器,表空間存儲的對象是段,在一個表空間中可以有一個或多個段,但是一個段只能屬于一個表空間。數據庫由一個或多個表空間組成,表空間從管理上可以劃分為系統表空間,用戶表空間、撤銷表空間、臨時表空間等。
2.頁的內部結構
頁如果按類型劃分的話,常見的有數據頁(保存B+樹節點)、系統頁、Undo頁和事務數據頁等。數據頁是我們最常使用的頁。
數據頁的16KB大小的存儲空間被劃分為七個部分,分別是文件頭(File Header)、頁頭(Page Header)、最大最小記錄(Infimum+supremum)、用戶記錄(User Records)、空閑空間(Free Space)、頁目錄(Page Directory)和文件尾(File Tailer) .
頁結構的示意圖如下所示:
這7個部分作用分別如下,簡單梳理如下表所示:
| File Header | 38字節 | 文件頭,描述頁的信息 |
| Page Header | 56字節 | 頁頭,頁的狀態信息 |
| lnfimum-Supremum | 26字節 | 最大和最小記錄,這是兩個虛擬的行記錄 |
| User Records | 不確定 | 用戶記錄,存儲行記錄內容 |
| Free Space | 不確定 | 空閑記錄,頁中還沒有被使用的空間 |
| Page Directory | 不確定 | 頁目錄,存儲用戶記錄的相對位置 |
| File Trailer | 8字節 | 文件尾,校驗頁是否完整 |
我們可以把這7個結構分成3個部分
第1部分:File Header(文件頭部)和File Trailer (文件尾部)
首先是文件通用部分,也就是文件頭和文件尾。
文件頭部信息
不同類型的頁都會以File Header作為第一個組成部分,它描述了一些針對各種頁都通用的一些信息,比方說這個頁的編號是多少,它的上一個頁、下一個頁是誰等,所有的數據頁會組成一個雙領衣。這個部分占用固定的no個當世R山下i力立比山方4日Lhh白:
Compact行格式會把可以為NULL的列統一管理起來,存在一個標記為NULL值列表中。如果表中沒有允許存儲 NULL 的列,則 NULL值列表也不存在了。
為什么定義NULL值列表?
之所以要存儲NULL是因為數據都是需要對齊的,如果沒有標注出來NULL值的位置,就有可能在查詢數據的時候出現混亂。如果使用一個特定的符號放到相應的數據位表示空置的話,雖然能達到效果,但是這樣很浪費空間,所以直接就在行數據得頭部開辟出一塊空間專門用來記錄該行數據哪些是非空數據,哪些是空數據,格式如下:
例如:字段 a、b、c,其中a是主鍵,在某一行中存儲的數依次是 a=1、b=null、c=2。那么Compact行格式中的NULL值列表中存儲:01。第一個0表示c不為null,第二個1表示b是null。這里之所以沒有a是因為數據庫會自動跳過主鍵,因為主鍵肯定是非NULL且唯一的,在NULL值列表的數據中就會自動跳過主鍵。
record_test_table的兩條記錄的NULL值列表就如下:
第一條記錄:
第二條記錄:
說明:本內容整理自尚硅谷B站MySQL視頻>>尚硅谷B站MySQL視頻
總結
以上是生活随笔為你收集整理的MySQL笔记:第07章_InnoDB数据存储结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: com.netflix.client.C
- 下一篇: 运动目标检测之光流法(2):金字塔Luc