>  기사  >  데이터 베이스  >  MySQL을 심층적으로 배우고 InnoDB의 논리적 저장 구조를 이해합니다.

MySQL을 심층적으로 배우고 InnoDB의 논리적 저장 구조를 이해합니다.

青灯夜游
青灯夜游앞으로
2021-09-15 19:26:202080검색

이 기사는 InnoDB 논리적 스토리지 구조를 안내해 드립니다. 도움이 되기를 바랍니다.

MySQL을 심층적으로 배우고 InnoDB의 논리적 저장 구조를 이해합니다.

InnoDB 논리적 저장 구조

InnoDB에서는 우리가 생성한 테이블과 해당 인덱스 데이터가 확장자가 .ibd인 파일에 저장됩니다. 이 파일 경로는 mysql 변수 를 확인하여 먼저 확인할 수 있습니다. datadir을 사용하여 가져온 다음 해당 데이터베이스 이름 디렉터리를 입력하면 ibd가 많이 표시되고 파일 이름은 테이블 이름이며 두 가지 유형의 테이블 공간, 공유 테이블 공간(또는 시스템 테이블 공간)이 있습니다. ) 및 독립 테이블스페이스 파일. [관련 권장 사항: mysql 비디오 튜토리얼]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)组成,引入一张网络图片。

MySQL을 심층적으로 배우고 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

공유 테이블스페이스의 경우 모든 테이블 데이터와 해당 인덱스가 여기에 저장됩니다. 독립 테이블스페이스의 경우 각 테이블의 데이터와 인덱스가 별도의 ibd 파일에 저장됩니다. 현재 MySQL 버전에서는 기본적으로 독립 테이블스페이스가 사용됩니다.
  • 공유 테이블스페이스 파일 이름은 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을 통해 전환할 수 있습니다. 데이터는 별도의 테이블스페이스 파일에 저장됩니다. 또한 각 테이블의 테이블스페이스에는 데이터와 인덱스만 저장됩니다. 롤백 정보, 시스템 트랜잭션 정보 및 보조 쓰기 버퍼와 같은 다른 유형의 데이터는 여전히 저장됩니다. 테이블스페이스의 원래 공유입니다.
  • 다음 명령문은 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 상태 수정
  • rrreee
  • innodb_file_per_table이 0인 경우, 즉 OFF인 경우 생성된 테이블이 시스템 공유 테이블 공간에 저장됩니다. 아래 예와 같습니다.

    rrreee

    닫은 후에는 새로운 IBD 파일이 생성되지 않는 것을 확인할 수 있습니다.
  • 테이블스페이스는 세그먼트, 익스텐트, 페이지로 구성되어 네트워크 그림을 소개합니다.

    MySQL을 심층적으로 배우고 InnoDB의 논리적 저장 구조를 이해합니다.
  • 1. Segment

    테이블스페이스는 물리적 파일을 관리하는 데 사용되는 논리적 구조입니다. . 세그먼트, 각 세그먼트는 N개의 영역과 32개의 분산된 페이지로 구성됩니다.
  • InnoDB 스토리지 엔진 테이블은 인덱스별로 구성되므로 데이터가 인덱스이고 인덱스가 데이터입니다. 일반적으로 인덱스가 생성되면 비리프 노드 세그먼트와 리프 노드 세그먼트라는 두 개의 세그먼트가 생성됩니다.

    2. 영역

  • 영역은 어쨌든 연속된 페이지로 구성된 공간입니다. 어쨌든 각 영역의 크기는 1MB입니다. 지역 내 페이지의 연속성을 보장하기 위해 InnoDB 스토리지 엔진은 디스크에서 한 번에 4~5개 지역에 적용됩니다. 기본적으로 InnoDB 스토리지 엔진의 페이지 크기는 16KB입니다. 이는 64개의 연속 페이지(16*64=1024=1M)가 있음을 의미합니다.

    InnoDB1.2.x 버전에는 기본 페이지 크기를 4K, 8K,
  • 3.page

    로 설정할 수 있는 innodb_page_size 매개변수가 추가되었습니다.

    페이지는 InnoDB 스토리지 엔진의 최소 디스크 관리 단위입니다. 기본값은 16kb입니다. 페이지 크기는 innodb_page_size 매개변수를 통해 4K, 8K 또는 16K로 설정할 수 있습니다. InnoDB는 다양한 목적을 달성하기 위해 다양한 유형의 페이지를 설계했습니다. InnoDB 스토리지 엔진의 일반적인 페이지 유형은

데이터 페이지

MySQL을 심층적으로 배우고 InnoDB의 논리적 저장 구조를 이해합니다.실행 취소 페이지

시스템 페이지 트랜잭션 데이터 페이지(트랜잭션 시스템)입니다. 페이지)버퍼 비트맵 삽입 페이지버퍼 프리 목록 페이지 삽입압축되지 않은 BLO 페이지압축된 BLO 페이지는 다음 명령으로 수행할 수 있습니다. 크기를 확인하세요. rrreee다음은 7개 부분으로 구성된 InnoDB 데이터 페이지 구조입니다. NameFunction파일 헤더는 페이지 헤더, 첵섬, 이전 및 다음 페이지 기록에 대한 일부 정보를 기록합니다. 기록된 페이지 상태 정보 및 저장 정보, 첫 번째 레코드 위치Infimum+ supremumInnoDB 각 데이터 페이지에는 두 개의 가상 행 레코드가 있으며, 레코드 경계를 제한하는 데 사용됩니다.
🎜🎜🎜행 레코드🎜🎜실제로 저장된 행 데이터 정보🎜🎜🎜🎜 여유 공간🎜🎜여유 공간, 링크드 리스트 구조🎜🎜🎜🎜페이지 디렉토리🎜🎜는 레코드의 상대적 위치를 저장합니다🎜🎜🎜🎜파일 트레일러🎜🎜innodb는 이를 사용하여 페이지가 디스크에 완전히 기록되었는지 확인합니다🎜 🎜 🎜🎜

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

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

위 내용은 MySQL을 심층적으로 배우고 InnoDB의 논리적 저장 구조를 이해합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제