溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

InnoDB中邏輯存儲(chǔ)結(jié)構(gòu)的示例分析

發(fā)布時(shí)間:2021-09-16 09:51:07 來(lái)源:億速云 閱讀:134 作者:小新 欄目:MySQL數(shù)據(jù)庫(kù)

這篇文章主要為大家展示了“InnoDB中邏輯存儲(chǔ)結(jié)構(gòu)的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“InnoDB中邏輯存儲(chǔ)結(jié)構(gòu)的示例分析”這篇文章吧。

InnoDB邏輯存儲(chǔ)結(jié)構(gòu)

在InnoDB中我們創(chuàng)建的表還有對(duì)應(yīng)的索引數(shù)據(jù)都存儲(chǔ)在擴(kuò)展名為.ibd 的文件中,這個(gè)文件路徑可以先通過(guò)查mysql變量datadir來(lái)得到,然后進(jìn)入對(duì)應(yīng)的數(shù)據(jù)庫(kù)名目錄,會(huì)看到很多ibd,文件名就是表名,這里有兩種類(lèi)型的表空間,共享表空間(或者叫系統(tǒng)表空間)和獨(dú)立表空間文件。

對(duì)于共享表空間,所有的表數(shù)據(jù)和相應(yīng)索引都存放在這里,而獨(dú)立表空間,就是每個(gè)表的數(shù)據(jù)和索引都存放在一個(gè)單獨(dú)的ibd文件中,在目前的MySQL版本中,默認(rèn)都是使用的獨(dú)立表空間。

共享表空間文件名可以通過(guò)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)

獨(dú)立和共享表空間可以通過(guò)innodb_file_per_table切換,如果啟用了他,那么每張表內(nèi)的數(shù)據(jù)就單獨(dú)放在一個(gè)表空間文件中,還需要注意,每個(gè)表的表空間只存儲(chǔ)數(shù)據(jù)、索引,其他類(lèi)的數(shù)據(jù),如回滾信息、系統(tǒng)事務(wù)信息、二次寫(xiě)緩沖仍存儲(chǔ)在原始共享表空間中。

下面語(yǔ)句可以查看innodb_file_per_table的狀態(tài)。

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狀態(tài)

set global innodb_file_per_table=0;

如果在innodb_file_per_table等于0的情況下,也就是OFF關(guān)閉情況下,創(chuàng)建的表都會(huì)存放的系統(tǒng)共享的表空間中,比如下面的列子。

1.創(chuàng)建database_1數(shù)據(jù)庫(kù)
mysql> create  database database_1;
Query OK, 1 row affected (0.02 sec)

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

3. 創(chuàng)建表
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. 關(guān)閉innodb_file_per_table后在創(chuàng)建表
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

可以發(fā)現(xiàn)在關(guān)閉后,沒(méi)有創(chuàng)建新的ibd文件。

表空間又由段(segment)、區(qū)(extent)、頁(yè)(page)組成,引入一張網(wǎng)絡(luò)圖片。

InnoDB中邏輯存儲(chǔ)結(jié)構(gòu)的示例分析

1.段

表空間由段組成,他是一個(gè)邏輯結(jié)構(gòu),用來(lái)管理物理文件,常見(jiàn)的段有數(shù)據(jù)段、索引段、回滾段,每個(gè)段由N個(gè)區(qū)和32個(gè)零散的頁(yè)組成。

InnoDB存儲(chǔ)引擎表是索引組織的,所以數(shù)據(jù)就是索引,索引就是數(shù)據(jù),通常情況下,創(chuàng)建一個(gè)索引的同時(shí)就會(huì)創(chuàng)建兩個(gè)段,分別為非葉子節(jié)點(diǎn)和葉子節(jié)點(diǎn)段。

2.區(qū)

區(qū)是由連續(xù)的頁(yè)組成的空間,無(wú)論如何,每個(gè)區(qū)的大小都是1MB。為了保證區(qū)域內(nèi)頁(yè)面的連續(xù)性,InnoDB存儲(chǔ)引擎一次從磁盤(pán)申請(qǐng)4-5個(gè)區(qū)域。默認(rèn)情況下,InnoDB存儲(chǔ)引擎的頁(yè)面大小為16KB,也就是有有64個(gè)連續(xù)頁(yè)面,16*64=1024=1M。

InnoDB1.2.x版本增加了參數(shù)innodb_page_size,這個(gè)參數(shù)允許設(shè)置默認(rèn)頁(yè)面大小為4K、8K,

3.頁(yè)

頁(yè)是InnoDB存儲(chǔ)引擎磁盤(pán)管理的最小單位,默認(rèn)16kb,可以通過(guò)參數(shù)innodb_page_size設(shè)置頁(yè)大小為4K、8K、16K 。InnoDB為了實(shí)現(xiàn)不同的目的而設(shè)計(jì)了很多種頁(yè),InnoDB 存儲(chǔ)引擎中常見(jiàn)的頁(yè)面類(lèi)型有:

  • 數(shù)據(jù)頁(yè)

  • undo頁(yè)面

  • 系統(tǒng)頁(yè)面

  • 事物數(shù)據(jù)頁(yè)面(交易系統(tǒng)頁(yè)面)

  • 插入緩沖位圖頁(yè)

  • 插入緩沖區(qū)空閑列表頁(yè)

  • 未壓縮的二進(jìn)制大對(duì)象頁(yè)面

  • 壓縮二進(jìn)制大對(duì)象頁(yè)面

可以通過(guò)以下命令查看大小。

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

mysql>

下面是InnoDB數(shù)據(jù)頁(yè)結(jié)構(gòu),它由七部分組成。

InnoDB中邏輯存儲(chǔ)結(jié)構(gòu)的示例分析

名稱(chēng)作用
File header記錄了頁(yè)頭的一些信息,cheksum、Ppervious和next page的記錄
Page header記錄了頁(yè)的狀態(tài)信息和存儲(chǔ)信息、首個(gè)記錄的position
Infimum+ supremumInnoDB每個(gè)數(shù)據(jù)頁(yè)有兩個(gè)虛擬行記錄,用來(lái)限定記錄邊界
Row records實(shí)際存儲(chǔ)的行數(shù)據(jù)信息
Free space空閑空間,同樣是鏈表結(jié)構(gòu)
Page directory存放了記錄的相對(duì)位置
File trailerinnodb利用它來(lái)保證頁(yè)完整地寫(xiě)入磁盤(pán)

4.行

InnoDB存儲(chǔ)引擎是面向行的,頁(yè)里面又記錄著行記錄的信息,也就是數(shù)據(jù)是按照行存儲(chǔ)的。行記錄數(shù)據(jù)又是按照行格式進(jìn)行存放的。每個(gè)頁(yè)存放的行記錄也是有硬性定義的,最多允許存放16KB/2-200行,也就是7992行。

InnoDB存儲(chǔ)引擎有兩種文件格式,一種叫Antelops,另外一種叫Barracuda。

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

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

可以通過(guò)以下方式查看當(dāng)前格式,其中Row_format就是對(duì)應(yīng)行格式存儲(chǔ)類(lèi)型。

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:

以上是“InnoDB中邏輯存儲(chǔ)結(jié)構(gòu)的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI