最近在考MySQL 8.0的OCP ,开个专题专门查漏补缺下

只是做备忘,有的概念只是一笔带过,具体可自行搜索

基于8.0.26

这期来介绍表空间,以下都为Innodb表空间,这节内容是File-Per-Table 表空间


## 1. File-Per-Table 表空间

File-Per-Table 表空间用于存放innodb表的数据和索引,一个表对应一个数据文件

当innodb_file_per_table参数开启后,创建的表默认是在File-Per-Table 表空间中,关闭该参数会导致表建立在系统表空间

数据文件的名称为table_name.ibd,会存放在数据目录的schema目录里面,我们可以在create table中使用DATA DIRECTORY 字句来指定放的目录


## 2. File-Per-Table 表空间的优势

  - 在drop或truncate表后会回收空间,而系统表空间则不可以
  - truncate table语句的性能会更好
  - 可以建立在不同的存储上,可以有更高的IO能力
  - 可以从另外的实例import表
  - 支持DYNAMIC and COMPRESSED行格式,系统表空间不可以
  - 可以通过查看数据文件的大小来得到表的大小
  - 每个表的最大大小为64TB,而其他共享表空间(系统表空间和通用表空间)总共只能64TB

## 3. File-Per-Table 表空间的劣势

和共享表空间(系统表空间和通用表空间)相比,其有如下劣势

- 由于数据文件只能被一个表使用,可能会造成空间的浪费
- 可能会造成open files过多影响性能
- drop table时会三秒整个buffer pool,缓冲池很大时会慢,可能延迟其他操作
- innodb_autoextend_increment参数对应该表空间无效,所以每次的增长量为4MB

### 3.参考连接

[https://dev.mysql.com/doc/refman/8.0/en/innodb-file-per-table-tablespaces.html](https://dev.mysql.com/doc/refman/8.0/en/innodb-file-per-table-tablespaces.html)