Dieser Artikel führt Sie durch die logische Speicherstruktur von InnoDB. Ich hoffe, er ist hilfreich für Sie!
In InnoDB werden die von uns erstellten Tabellen und die entsprechenden Indexdaten in Dateien mit der Erweiterung .ibd gespeichert. Dieser Dateipfad kann zunächst durch Überprüfen der MySQL-Variablen überprüft werden datadir
Um es abzurufen, geben Sie dann das entsprechende Verzeichnis mit dem Datenbanknamen ein. Sie werden viele ibd sehen. Der Dateiname ist der Tabellenname. Es gibt zwei Arten von Tabellenbereichen: gemeinsam genutzten Tabellenbereich (oder Systemtabellenbereich). ) und unabhängige Tabellenbereichsdatei. [Verwandte Empfehlungen: MySQL-Video-Tutorial]datadir
来得到,然后进入对应的数据库名目录,会看到很多ibd,文件名就是表名,这里有两种类型的表空间,共享表空间(或者叫系统表空间)和独立表空间文件。【相关推荐:mysql视频教程】
对于共享表空间,所有的表数据和相应索引都存放在这里,而独立表空间,就是每个表的数据和索引都存放在一个单独的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)组成,引入一张网络图片。
表空间由段组成,他是一个逻辑结构,用来管理物理文件,常见的段有数据段、索引段、回滚段,每个段由N个区和32个零散的页组成。
InnoDB存储引擎表是索引组织的,所以数据就是索引,索引就是数据,通常情况下,创建一个索引的同时就会创建两个段,分别为非叶子节点和叶子节点段。
区是由连续的页组成的空间,无论如何,每个区的大小都是1MB。为了保证区域内页面的连续性,InnoDB存储引擎一次从磁盘申请4-5个区域。默认情况下,InnoDB存储引擎的页面大小为16KB,也就是有有64个连续页面,16*64=1024=1M。
InnoDB1.2.x版本增加了参数innodb_page_size
,这个参数允许设置默认页面大小为4K、8K,
页是InnoDB存储引擎磁盘管理的最小单位,默认16kb,可以通过参数innodb_page_size
innodb_data_file_path
abgerufen werden. mysql> show status like 'innodb_page_size'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | Innodb_page_size | 16384 | +------------------+-------+ 1 row in set (0.00 sec) mysql>Unabhängige und gemeinsam genutzte Tabellenbereiche können über
innodb_file_per_table
umgeschaltet werden Die Daten werden in einer separaten Tabellenbereichsdatei abgelegt. Es ist außerdem zu beachten, dass im Tabellenbereich jeder Tabelle nur Daten und Indizes gespeichert werden die ursprüngliche Freigabe im Tabellenbereich. innodb_file_per_table
überprüft werden. 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:Ändern Sie den
innodb_file_per_table
-Status innodb_file_per_table
gleich 0 ist, d. h. wenn AUS, werden die erstellten Tabellen im gemeinsam genutzten Tabellenbereich des Systems gespeichert. wie das Beispiel unten. rrreee
Sie können feststellen, dass nach dem Schließen keine neue ibd-Datei erstellt wird.innodb_page_size
hinzu, der das Festlegen der Standardseitengröße auf 4K, 8K, ermöglicht
Seite ist die kleinste Einheit der Festplattenverwaltung der InnoDB-Speicher-Engine. Die Standardgröße ist 16 KB. Die Seitengröße kann über den Parameterinnodb_page_size
eingestellt werden. InnoDB hat viele Arten von Seiten entwickelt, um unterschiedliche Zwecke zu erreichen. Gängige Seitentypen in der InnoDB-Speicher-Engine sind: Rückgängig-Seite
Transaktionsdatenseite (Transaktionssystem). Seite) | |
---|---|
Pufferfreie Listenseite einfügen | |
Unkomprimierte BLO-Seite | |
kann mit dem folgenden Befehl durchgeführt werden. Überprüfen Sie die Größe. | |
Name | Funktion: |
Freier Speicherplatz, auch eine verknüpfte Listenstruktur | |
speichert die relative Position des Datensatzes |
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:
原文地址:https://juejin.cn/post/6999936914119720996
作者:i听风逝夜
更多编程相关知识,请访问:编程视频!!
Das obige ist der detaillierte Inhalt vonLernen Sie MySQL ausführlich kennen und verstehen Sie die logische Speicherstruktur von InnoDB. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!