Cet article vous fera découvrir la structure de stockage logique d'InnoDB. J'espère qu'il vous sera utile !
Dans InnoDB, les tables que nous créons et les données d'index correspondantes sont stockées dans des fichiers avec l'extension .ibd. Ce chemin de fichier peut d'abord être vérifié en vérifiant la variable mysql . datadir
pour l'obtenir, puis entrez le répertoire du nom de la base de données correspondant, vous verrez beaucoup d'ibd, le nom du fichier est le nom de la table, il existe deux types d'espaces table, l'espace table partagé (ou l'espace table système ) et un fichier d'espace table indépendant. [Recommandations associées : mysql video tutoriel]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
, mysql> show status like 'innodb_page_size'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | Innodb_page_size | 16384 | +------------------+-------+ 1 row in set (0.00 sec) mysql>
innodb_file_per_table
. S'il est activé, alors le. Les données sont placées dans un fichier d'espace table distinct. Il convient également de noter que l'espace table de chaque table stocke uniquement les données et les index. D'autres types de données, tels que les informations d'annulation, les informations sur les transactions système et les tampons d'écriture secondaires, sont toujours stockés dans. le partage d'origine dans l'espace table. innodb_file_per_table
. 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_file_per_table
innodb_file_per_table
est égal à 0, c'est-à-dire lorsqu'il est désactivé, les tables créées seront stockées dans l'espace table partagé du système, comme l'exemple ci-dessous. rrreee
Vous pouvez constater qu'aucun nouveau fichier ibd n'est créé après la fermeture.innodb_page_size
, qui permet de définir la taille de page par défaut à 4K, 8K, La page est la plus petite unité de gestion de disque du moteur de stockage InnoDB. La taille par défaut est de 16 Ko. La taille de la page peut être définie sur 4K, 8K ou 16K via le paramètre
innodb_page_size
. InnoDB a conçu de nombreux types de pages pour atteindre différents objectifs. Les types de pages courants dans le moteur de stockage InnoDB sont : page d'annulation
page de données de transaction (système de transaction). page) | |
---|---|
Insérer une page de liste sans tampon | |
Page BLO non compressée | |
peut être effectuée par la commande suivante Vérifiez la taille. | |
Nom | Fonction |
En-tête de fichier | |
En-tête de page |
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听风逝夜
更多编程相关知识,请访问:编程视频!!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!