這篇文章主要為大家展示了“InnoDB中邏輯存儲結(jié)構(gòu)的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“InnoDB中邏輯存儲結(jié)構(gòu)的示例分析”這篇文章吧。
成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站制作、成都做網(wǎng)站與策劃設(shè)計,吳川網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:吳川等地區(qū)。吳川做網(wǎng)站價格咨詢:028-86922220
在InnoDB中我們創(chuàng)建的表還有對應(yīng)的索引數(shù)據(jù)都存儲在擴展名為.ibd 的文件中,這個文件路徑可以先通過查MySQL變量datadir
來得到,然后進入對應(yīng)的數(shù)據(jù)庫名目錄,會看到很多ibd,文件名就是表名,這里有兩種類型的表空間,共享表空間(或者叫系統(tǒng)表空間)和獨立表空間文件。
對于共享表空間,所有的表數(shù)據(jù)和相應(yīng)索引都存放在這里,而獨立表空間,就是每個表的數(shù)據(jù)和索引都存放在一個單獨的ibd文件中,在目前的MySQL版本中,默認(rèn)都是使用的獨立表空間。
共享表空間文件名可以通過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
切換,如果啟用了他,那么每張表內(nèi)的數(shù)據(jù)就單獨放在一個表空間文件中,還需要注意,每個表的表空間只存儲數(shù)據(jù)、索引,其他類的數(shù)據(jù),如回滾信息、系統(tǒng)事務(wù)信息、二次寫緩沖仍存儲在原始共享表空間中。
下面語句可以查看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)建的表都會存放的系統(tǒng)共享的表空間中,比如下面的列子。
1.創(chuàng)建database_1數(shù)據(jù)庫 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)閉后,沒有創(chuàng)建新的ibd文件。
表空間又由段(segment)、區(qū)(extent)、頁(page)組成,引入一張網(wǎng)絡(luò)圖片。
表空間由段組成,他是一個邏輯結(jié)構(gòu),用來管理物理文件,常見的段有數(shù)據(jù)段、索引段、回滾段,每個段由N個區(qū)和32個零散的頁組成。
InnoDB存儲引擎表是索引組織的,所以數(shù)據(jù)就是索引,索引就是數(shù)據(jù),通常情況下,創(chuàng)建一個索引的同時就會創(chuàng)建兩個段,分別為非葉子節(jié)點和葉子節(jié)點段。
區(qū)是由連續(xù)的頁組成的空間,無論如何,每個區(qū)的大小都是1MB。為了保證區(qū)域內(nèi)頁面的連續(xù)性,InnoDB存儲引擎一次從磁盤申請4-5個區(qū)域。默認(rèn)情況下,InnoDB存儲引擎的頁面大小為16KB,也就是有有64個連續(xù)頁面,16*64=1024=1M。
InnoDB1.2.x版本增加了參數(shù)innodb_page_size
,這個參數(shù)允許設(shè)置默認(rèn)頁面大小為4K、8K,
頁是InnoDB存儲引擎磁盤管理的最小單位,默認(rèn)16kb,可以通過參數(shù)innodb_page_size
設(shè)置頁大小為4K、8K、16K 。InnoDB為了實現(xiàn)不同的目的而設(shè)計了很多種頁,InnoDB 存儲引擎中常見的頁面類型有:
數(shù)據(jù)頁
undo頁面
系統(tǒng)頁面
事物數(shù)據(jù)頁面(交易系統(tǒng)頁面)
插入緩沖位圖頁
插入緩沖區(qū)空閑列表頁
未壓縮的二進制大對象頁面
壓縮二進制大對象頁面
可以通過以下命令查看大小。
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ù)頁結(jié)構(gòu),它由七部分組成。
名稱 | 作用 |
---|---|
File header | 記錄了頁頭的一些信息,cheksum、Ppervious和next page的記錄 |
Page header | 記錄了頁的狀態(tài)信息和存儲信息、首個記錄的position |
Infimum+ supremum | InnoDB每個數(shù)據(jù)頁有兩個虛擬行記錄,用來限定記錄邊界 |
Row records | 實際存儲的行數(shù)據(jù)信息 |
Free space | 空閑空間,同樣是鏈表結(jié)構(gòu) |
Page directory | 存放了記錄的相對位置 |
File trailer | innodb利用它來保證頁完整地寫入磁盤 |
InnoDB存儲引擎是面向行的,頁里面又記錄著行記錄的信息,也就是數(shù)據(jù)是按照行存儲的。行記錄數(shù)據(jù)又是按照行格式進行存放的。每個頁存放的行記錄也是有硬性定義的,最多允許存放16KB/2-200行,也就是7992行。
InnoDB存儲引擎有兩種文件格式,一種叫Antelops,另外一種叫Barracuda。
在Antelope文件格式下,有compact和redundant兩種行記錄格式。
在Barracuda文件格式下,有compressed和dynamic兩種行記錄格式。
可以通過以下方式查看當(dāng)前格式,其中Row_format就是對應(yīng)行格式存儲類型。
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中邏輯存儲結(jié)構(gòu)的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!