InnoDB的邏輯儲存結構是什麼,表空間組成包括哪些?

xuxh120發表於2022-05-02

一、表空間

在InnoDB中我們建立的表還有對應的索引資料都儲存在副檔名為.ibd 的檔案中,這個檔案路徑可以先通過查mysql變數datadir來得到,然後進入對應的資料庫名目錄,會看到很多ibd,檔名就是表名,這裡有兩種型別的表空間,共享表空間(或者叫系統表空間)和獨立表空間檔案。

對於共享表空間,所有的表資料和相應索引都存放在這裡,而獨立表空間,就是每個表的資料和索引都存放在一個單獨的ibd檔案中,在目前的MySQL版本中,預設都是使用的獨立表空間。

共享表空間檔名可以通過innodb_data_file_path得到,

mysql> show variables like 'innodb_data_file_path';
+-----------------------+------------------------+
| Variable_name         | Value                  |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
+-----------------------+------------------------+
1 row in set (0.00 sec)

 

獨立和共享表空間可以通過innodb_file_per_table切換,如果啟用了他,那麼每張表內的資料就單獨放在一個表空間檔案中,還需要注意,每個表的表空間只儲存資料、索引,其他類的資料,如回滾資訊、系統事務資訊、二次寫緩衝仍儲存在原始共享表空間中。

下面語句可以檢視innodb_file_per_table的狀態。

mysql> show variables like '%innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.01 sec)

 

修改innodb_file_per_table狀態

set global innodb_file_per_table=0;

  

如果在innodb_file_per_table等於0的情況下,也就是OFF關閉情況下,建立的表都會存放的系統共享的表空間中,比如下面的列子。

1.建立database_1資料庫
mysql> create  database database_1;
Query OK, 1 row affected (0.02 sec)

2. 當前狀態
mysql> show variables like '%innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.01 sec)

3. 建立表
mysql> create table t1(id int(11));
Query OK, 0 rows affected, 1 warning (0.05 sec)


4. 檢視ibd檔案
root@hxl-PC:/var/lib/mysql/database_1# ls
t1.ibd
root@hxl-PC:/var/lib/mysql/database_1# 

5. 關閉innodb_file_per_table後在建立表
mysql> set global innodb_file_per_table=0;
Query OK, 0 rows affected (0.01 sec)

mysql> create table t2(id int(11));
Query OK, 0 rows affected, 1 warning (0.05 sec)
6. 檢視ibd檔案
root@hxl-PC:/var/lib/mysql/database_1# ls
t1.ibd

 

可以發現在關閉後,沒有建立新的ibd檔案。

表空間又由段(segment)、區(extent)、頁(page)組成,引入一張網路圖片。

image.png

二、段

表空間由段組成,他是一個邏輯結構,用來管理物理檔案,常見的段有資料段、索引段、回滾段,每個段由N個區和32個零散的頁組成。

InnoDB預設是基於B+樹實現的資料儲存。這裡的索引段則是指的B+樹的非葉子節點,而資料段則是B+樹的葉子節點。而回滾段則指的是回滾資料,事務隔離的MVCC利用了回滾段實現了多版本查詢資料。

 

三、區

區是由連續的頁組成的空間,無論如何,每個區的大小都是1MB。為了保證區域內頁面的連續性,InnoDB儲存引擎一次從磁碟申請4-5個區域。

 

 

四、頁

頁是InnoDB儲存引擎磁碟管理的最小單位,預設16kb,可以通過引數innodb_page_size設定頁大小為4K、8K、16K 。

預設情況下,InnoDB儲存引擎的區大小為1MB,也就是有64個連續頁組成,即16*64=1024=1M。

InnoDB為了實現不同的目的而設計了很多種頁,InnoDB 儲存引擎中常見的頁面型別有:

  1. 資料頁

  2. undo頁面

  3. 系統頁面

  4. 事物資料頁面(交易系統頁面)

  5. 插入緩衝點陣圖頁

  6. 插入緩衝區空閒列表頁

  7. 未壓縮的二進位制大物件頁面

  8. 壓縮二進位制大物件頁面

可以通過以下命令檢視大小。

mysql> show status like 'innodb_page_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| Innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)

  

下面是InnoDB資料頁結構,它由七部分組成。

image.png

名稱作用
File header 記錄了頁頭的一些資訊,cheksum、Ppervious和next page的記錄
Page header 記錄了頁的狀態資訊和儲存資訊、首個記錄的position
Infimum+ supremum InnoDB每個資料頁有兩個虛擬行記錄,用來限定記錄邊界
Row records 實際儲存的行資料資訊
Free space 空閒空間,同樣是連結串列結構
Page directory 存放了記錄的相對位置
File trailer innodb利用它來保證頁完整地寫入磁碟

 

五、行

InnoDB儲存引擎是面向行的,頁裡面又記錄著行記錄的資訊,也就是資料是按照行儲存的。行記錄資料又是按照行格式進行存放的。每個頁存放的行記錄也是有硬性定義的,最多允許存放16KB/2-200行,也就是7992行。

InnoDB儲存引擎有兩種檔案格式,一種叫Antelops,另外一種叫Barracuda。

在Antelope檔案格式下,有compact和redundant兩種行記錄格式。

在Barracuda檔案格式下,有compressed和dynamic兩種行記錄格式。

可以通過以下方式檢視當前格式,其中Row_format就是對應行格式儲存型別。

mysql> show table status \G;
*************************** 1. row ***************************
           Name: t1
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 15
 Avg_row_length: 1092
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2021-08-24 09:43:29
    Update_time: 2021-08-24 14:43:35
     Check_time: NULL
      Collation: utf8mb4_0900_ai_ci
       Checksum: NULL
 Create_options: 
        Comment: 

 

 

文章資料:

  1. https://www.cnblogs.com/agilestyle/p/11428574.html
  2. https://juejin.cn/post/6999936914119720996
  3. https://time.geekbang.org/column/article/121710 

 

相關文章