Maison  >  Article  >  base de données  >  Apprenez MySQL en profondeur et comprenez la structure de stockage logique d'InnoDB

Apprenez MySQL en profondeur et comprenez la structure de stockage logique d'InnoDB

青灯夜游
青灯夜游avant
2021-09-15 19:26:202139parcourir

Cet article vous fera découvrir la structure de stockage logique d'InnoDB. J'espère qu'il vous sera utile !

Apprenez MySQL en profondeur et comprenez la structure de stockage logique d'InnoDB

Structure de stockage logique InnoDB

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)组成,引入一张网络图片。

Apprenez MySQL en profondeur et comprenez la structure de stockage logique dInnoDB

1.段

表空间由段组成,他是一个逻辑结构,用来管理物理文件,常见的段有数据段、索引段、回滚段,每个段由N个区和32个零散的页组成。

InnoDB存储引擎表是索引组织的,所以数据就是索引,索引就是数据,通常情况下,创建一个索引的同时就会创建两个段,分别为非叶子节点和叶子节点段。

2.区

区是由连续的页组成的空间,无论如何,每个区的大小都是1MB。为了保证区域内页面的连续性,InnoDB存储引擎一次从磁盘申请4-5个区域。默认情况下,InnoDB存储引擎的页面大小为16KB,也就是有有64个连续页面,16*64=1024=1M。

InnoDB1.2.x版本增加了参数innodb_page_size,这个参数允许设置默认页面大小为4K、8K,

3.页

页是InnoDB存储引擎磁盘管理的最小单位,默认16kb,可以通过参数innodb_page_size

Pour les espaces table partagés, toutes les données de la table et les index correspondants sont stockés ici. Pour les espaces table indépendants, les données et les index de chaque table sont stockés dans un fichier ibd distinct. Dans la version actuelle de MySQL, la valeur par défaut est l'espace de table indépendant utilisé.
  • Le nom du fichier de l'espace table partagé peut être obtenu via 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>

    Les espaces table indépendants et partagés peuvent être commutés via 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.
  • L'instruction suivante peut vérifier l'état de 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:

    Modifier le statut de innodb_file_per_table
  • rrreee
  • Si 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.
  • L'espace table est composé de segments, d'étendues et de pages, introduisant une image de réseau.

    Apprenez MySQL en profondeur et comprenez la structure de stockage logique dInnoDB
  • 1. Segment

    L'espace table est composé de segments. Il s'agit d'une structure logique utilisée pour gérer les fichiers physiques. Les segments de données, les segments d'index et les restaurations. . Segments, chaque segment est constitué de N zones et de 32 pages dispersées.
  • Les tables du moteur de stockage InnoDB sont organisées par index, donc les données sont l'index, et l'index est les données. Normalement, lors de la création d'un index, deux segments seront créés, à savoir les segments de nœud non-feuille et les segments de nœud feuille.

    2. Zone

  • Une zone est un espace composé de pages consécutives. Dans tous les cas, la taille de chaque zone est de 1Mo. Afin d'assurer la continuité des pages au sein de la région, le moteur de stockage InnoDB s'applique à 4 à 5 régions du disque à la fois. Par défaut, la taille des pages du moteur de stockage InnoDB est de 16 Ko, ce qui signifie qu'il y a 64 pages consécutives, 16*64=1024=1M.

    La version InnoDB1.2.x ajoute le paramètre innodb_page_size, qui permet de définir la taille de page par défaut à 4K, 8K,
  • 3.page

    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 de données

Apprenez MySQL en profondeur et comprenez la structure de stockage logique dInnoDBpage d'annulation

page système page de données de transaction (système de transaction). page)Insérer une page bitmap tamponnéeInsérer une page de liste sans tamponPage BLO non compresséePage BLO compresséepeut être effectuée par la commande suivante Vérifiez la taille. rrreeeCe qui suit est la structure de la page de données InnoDB, qui se compose de sept parties. NomFonctionEn-tête de fichier enregistre certaines informations sur l'en-tête de page, le cheksum, les enregistrements de page précédente et suivanteEn-tête de pageInformations sur l'état de la page enregistrée et informations de stockage, la position du premier enregistrement
🎜🎜🎜Infimum+ supremum🎜🎜InnoDB chaque page de données contient deux enregistrements de ligne virtuels, utilisés pour limiter la limite de l'enregistrement🎜🎜🎜🎜Enregistrements de ligne🎜🎜informations de données de ligne réellement stockées 🎜🎜🎜🎜 Espace libre🎜🎜Espace libre, également une structure de liste chaînée🎜🎜🎜🎜Répertoire de pages🎜🎜 stocke la position relative de l'enregistrement🎜🎜🎜🎜Remorque de fichier🎜🎜innodb l'utilise pour garantir que la page est complètement écrite sur le disque🎜 🎜 🎜🎜

4.行

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer