Heim  >  Artikel  >  Datenbank  >  Lernen Sie MySQL ausführlich kennen und verstehen Sie die logische Speicherstruktur von InnoDB

Lernen Sie MySQL ausführlich kennen und verstehen Sie die logische Speicherstruktur von InnoDB

青灯夜游
青灯夜游nach vorne
2021-09-15 19:26:202140Durchsuche

Dieser Artikel führt Sie durch die logische Speicherstruktur von InnoDB. Ich hoffe, er ist hilfreich für Sie!

Lernen Sie MySQL ausführlich kennen und verstehen Sie die logische Speicherstruktur von InnoDB

Logische Speicherstruktur von InnoDB

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

Lernen Sie MySQL ausführlich kennen und verstehen Sie die logische Speicherstruktur von InnoDB

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

Bei gemeinsam genutzten Tabellenbereichen werden alle Tabellendaten und entsprechenden Indizes hier gespeichert. Bei unabhängigen Tabellenbereichen werden die Daten und Indizes jeder Tabelle in einer separaten ibd-Datei gespeichert. In der aktuellen MySQL-Version wird standardmäßig der unabhängige Tabellenbereich verwendet.
  • Der Dateiname des gemeinsam genutzten Tabellenbereichs kann über 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.
  • Mit der folgenden Anweisung kann der Status von 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
  • rrreee
  • Wenn 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.
  • Der Tabellenbereich besteht aus Segmenten, Erweiterungen und Seiten, wodurch ein Netzwerkbild entsteht.

    Lernen Sie MySQL ausführlich kennen und verstehen Sie die logische Speicherstruktur von InnoDB
  • 1. Segment

    Der Tabellenbereich besteht aus Segmenten. Es handelt sich um eine logische Struktur, die zur Verwaltung physischer Dateien verwendet wird . Segmente, jedes Segment besteht aus N Bereichen und 32 verstreuten Seiten.
  • InnoDB-Speicher-Engine-Tabellen sind nach Index organisiert, sodass die Daten der Index und der Index die Daten sind. Normalerweise werden beim Erstellen eines Index zwei Segmente erstellt, nämlich Nicht-Blattknotensegmente und Blattknotensegmente.

    2. Bereich

  • Ein Bereich ist ein Bereich, der aus aufeinanderfolgenden Seiten besteht. Die Größe jedes Bereichs beträgt in jedem Fall 1 MB. Um die Kontinuität der Seiten innerhalb der Region sicherzustellen, wendet die InnoDB-Speicher-Engine jeweils 4–5 Regionen von der Festplatte an. Standardmäßig beträgt die Seitengröße der InnoDB-Speicher-Engine 16 KB, was bedeutet, dass es 64 aufeinanderfolgende Seiten gibt, 16 * 64 = 1024 = 1 MB.

    InnoDB1.2.x-Version fügt den Parameter innodb_page_size hinzu, der das Festlegen der Standardseitengröße auf 4K, 8K,
  • 3.page

    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 Parameter innodb_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:

Datenseite

Lernen Sie MySQL ausführlich kennen und verstehen Sie die logische Speicherstruktur von InnoDBRückgängig-Seite

Systemseite Transaktionsdatenseite (Transaktionssystem). Seite)Gepufferte Bitmap-Seite einfügenPufferfreie Listenseite einfügenUnkomprimierte BLO-SeiteKomprimierte BLO-Seitekann mit dem folgenden Befehl durchgeführt werden. Überprüfen Sie die Größe. rrreeeDas Folgende ist die InnoDB-Datenseitenstruktur, die aus sieben Teilen besteht. NameFunktion: Aufgezeichnete Seitenstatusinformationen und Speicherinformationen, die Position des ersten Datensatzes. Infimum + Supremum Freier SpeicherplatzSeitenverzeichnisDateitrailer
Freier Speicherplatz, auch eine verknüpfte Listenstruktur
speichert die relative Position des Datensatzes
innodb verwendet ihn, um sicherzustellen, dass die Seite vollständig auf die Festplatte geschrieben wird🎜 🎜 🎜🎜

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听风逝夜

更多编程相关知识,请访问:编程视频!!

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen