이 기사는 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)组成,引入一张网络图片。
表空间由段组成,他是一个逻辑结构,用来管理物理文件,常见的段有数据段、索引段、回滚段,每个段由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
을 통해 전환할 수 있습니다. 데이터는 별도의 테이블스페이스 파일에 저장됩니다. 또한 각 테이블의 테이블스페이스에는 데이터와 인덱스만 저장됩니다. 롤백 정보, 시스템 트랜잭션 정보 및 보조 쓰기 버퍼와 같은 다른 유형의 데이터는 여전히 저장됩니다. 테이블스페이스의 원래 공유입니다. 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
이 0인 경우, 즉 OFF인 경우 생성된 테이블이 시스템 공유 테이블 공간에 저장됩니다. 아래 예와 같습니다. rrreee
닫은 후에는 새로운 IBD 파일이 생성되지 않는 것을 확인할 수 있습니다.로 설정할 수 있는 innodb_page_size
매개변수가 추가되었습니다.
innodb_page_size
매개변수를 통해 4K, 8K 또는 16K로 설정할 수 있습니다. InnoDB는 다양한 목적을 달성하기 위해 다양한 유형의 페이지를 설계했습니다. InnoDB 스토리지 엔진의 일반적인 페이지 유형은 실행 취소 페이지
트랜잭션 데이터 페이지(트랜잭션 시스템)입니다. 페이지) | |
---|---|
버퍼 프리 목록 페이지 삽입 | |
압축되지 않은 BLO 페이지 | |
는 다음 명령으로 수행할 수 있습니다. 크기를 확인하세요. | |
Name | Function |
파일 헤더 | |
Infimum+ supremum |
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!