目录

6.3 逻辑结构

InnoDB逻辑存储单元主要分为表空间、段、区、页、行.

6.3.1表空间

表空间用于存储表结构和数据,InnoDB存储引擎表中所有数据都是存储在表空间中的,表空间分为系统表空间、独立表空间、通用表空间、临时表空间、Undo表空间等。

(1)系统表空间(System Tablespace)

包含InnoDB数据字典,Doublewrite Buffer,Change Buffer的存储区域。系统表空间也默认包含任何用户在系统表空间创建的表数据和索引数据。系统表空间是一个共享的表空间因为它是被多个表共享的,该空间的数据文件通过参数innodb_data_file_path控制。

默认值是ibdata1:12M:autoextend(文件名为ibdata1、12MB、自动扩展)。

(2)独立表空间(File- Per- Tablespaces)

默认开启,独立表空间是一个单表表空间,该表创建于自己的数据文件中,而非创建于系统表空间中。当innodb_file_per_table选项开启时,表将被创建于表空间中。否则,innodb将被创建于系统表空间中。每个表文件表空间由一个.ibd数据文件代表,该文件默认被创建于数据库目录中。

表空间的表文件支持动态(dynamic)和压缩(commpressed)行格式。

(3)通用表空间

通用表空间为通过create tablespace语法创建的共享表空间。通用表空间可以创建于MySQL数据目录外的其他位置,其可以容纳多张表,且其支持所有的行格式。

(4)撤销表空间(Undo Tablespaces)

撤销表空间由一个或多个包含Undo日志文件组成,InnoDB使用的undo表空间由innodb_undo_tablespaces配置选项控制,默认为0。

① 参数值为0表示使用系统表空间ibdata1;

② 大于0表示使用undo表空间undo_001、undo_002等。

(5)临时表空间(Temporary Tablespaces)

分为session temporary tablespaces和global temporary tablespace两种。

① session temporary tablespaces存储的是用户创建的临时表和磁盘内部的临时表。

② global temporary tablespace储存用户临时表的回滚段(rollback segments )。

MySQL服务器正常关闭或异常终止时,临时表空间将被移除,每次启动时会被重新创建。

 6.3.2段

表空间是由段组成的,可以把一个表理解为一个段,通常有数据段、回滚段、索引段等。

6.3.3区

区是由连续的页组成的,是物理上连续分配的一段空间,每个区的大小固定是1MB。

6.3.4页

InnoDB的最小物理存储分配单位是page,有数据页回滚页等。一般情况下, 一个区由64个连接的页组成,页默认大小是16KB.

6.3.5行

页里面又记录着行记录的信息,InnoDB存储引擎是面向行的,也就是数据是按照行存储的,Innodb存储引擎有常用的文件格式为Dynamic和Compressed行格式。

mysql> show variables like 'innodb%format';

6.3.6 表空间

1① 通用表空间
2//创建表空间ts1
3CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd' Engine=InnoDB;
4CREATE TABLESPACE `ts3` ADD DATAFILE '/tmp/ts3.ibd' ENGINE=INNODB;
5//将表添加到ts1表空间
6CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;
7//删除表空间,必须删除表
8DROP TABLESPACE tablespace_name
9//重命名表空间
10ALTER TABLESPACE ts3 RENAME TO ts001
11② undo表空间
12CREATE UNDO TABLESPACE undo_003 ADD DATAFILE 'undo_003.ibu';
13//停用UNDO表空间
14ALTER UNDO TABLESPACE undo_003 SET INACTIVE;
15//删除UNDO表空间
16DROP UNDO TABLESPACE undo_003;
17//启用UNDO表空间
18ALTER UNDO TABLESPACE undo_003 SET ACTIVE;
19 
20查看表空间信息
21mysql> select * from information_schema.INNODB_TABLESPACES_BRIEF;
22mysql> select a.SPACE,a.`NAME`,a.SPACE_TYPE,a.ROW_FORMAT,a.STATE
23from information_schema.INNODB_TABLESPACES a
24

6.3.7 分区表

我们可以通过 show variables like '%datadir%命令来查看数据文件存放的默认路径,一个数据库就是一个文件夹,一个库中。只要一张表的数据量过大,就会导致 *.ibd 文件过大,数据的查找就会变的很慢。

MySQL从5.1开始添加了对分区的支持,分区的过程是将一个表或索引分解为多个更小、更可管理的部分。对于开发者而言,分区后的表使用方式和不分区基本上还是一模一样,只不过在物理存储上,原本该表只有一个数据文件,现在变成了多个,每个分区都是独立的对象,可以独自处理,也可以作为一个更大对象的一部分进行处理。