MySQL 优化表空间

在使用 MySQL 的过程中,可能会出现如下的情况:

使用 delete 语句删除大部分数据之后,表文件的大小却并没有发生变化。导致这种情况出现的原因有多种。

独立表空间

首先是 innodb_file_per_table 这个参数的设置。这个参数的作用是控制表文件的存放位置。

  • OFF:表数据放在系统表共享空间之中,即数据字典的存放处
  • ON:每张表的数据单独存放在 .ibd 的文件中

在设置为开启之后,使用 drop table 命令就会删除掉表的数据文件,从而回收空间。

MySQL 数据中的空洞

其次是表记录删除过程所导致的”空洞“。在对表的记录进行删除时,delete 命令会将记录的位置或者数据页的状态标记为可复用,而磁盘文件的大小并不会产生变动。

标记为可复用的位置如果没有新的数据填入,那么空洞就会一直存在,这将导致即使是数据被删除了,但是整体文件的大小却没有变化。

除此之外,由于插入数据的随机,导致数据页分裂也会导致空洞的产生。

为了消除文件中的空洞,优化整体的空间,需要使用到重建命令对表重建。命令如下:

1
ALERT TABLE t_name ENGINE = InnoDB;

表的重建过程

MySQL 对表的重建是 online 的, 过程如下:

  1. 首先建立一个临时文件, tmp;
  2. 将表 T 中的所有数据存储到 tmp 中;
  3. 记录替换过程中表 T 的所有操作,写入 raw log 中;
  4. 根据 raw log 中的记录,操作 tmp;
  5. 使用 tmp 替换 T;

在重建表之后才能收缩表空间。


MySQL 优化表空间
https://blog.zhangliangliang.cc/post/mysql-optimize-table.html
作者
Bobby Zhang
发布于
2019年5月2日
许可协议