Mysql压缩表空间 Optimize

通过Optimize可以重新组织表的存储结构,去除碎片,从而提高查询性能、减少存储空间占用。

仅InnoDB和MyISAM引擎支持optimize table语句。

 

1、与delete的区别

delete只会将记录的位置或者数据页标记为"可复用",但是数据库磁盘文件的大小不会改变,即表空间不会被回收。

 

2、optimize执行过程(原理)

optimize命令的过程包括以下几个关键步骤:

  1. 创建临时表:MySQL 首先会创建一个与原表结构相同的临时表。
  2. 复制数据到临时表:将原表中的数据复制到临时表中。
  3. 优化表:在数据复制的过程中,MySQL 会对数据进行整理和重组,去除碎片,提高数据的连续性。
  4. 重命名表:当数据复制完成并且表被优化后,MySQL 会删除原表,然后将临时表重命名为原表的名称。

通过这个过程,OPTIMIZE TABLE 可以帮助数据库重新组织表的存储结构,提高查询性能和减少存储空间占用。

也就是说在执行optimize的时候,因为其本质是创建了临时表,所以会生成一个新的ibd文件,在临时表覆盖原表之后,原ibd文件也会被删除。

所以应该注意:

  • 可能会暂时锁定表,因此在高并发的系统中使用时需要谨慎。在MySQL5.7和MySQL8.0及以上版本的时候,因为数据库支持online DDL,可以并发执行。所以执行这个语句的时候,会有一小段时间锁表,之后DML语句是可以执行的。
  • 对于非常大的表,可能会消耗大量的时间和资源。因为用OPTIMIZE TABLE需要创建一个临时表,所以需要在此之前保证磁盘容量足够。
  • 建议操作前进行备份,以防意外的发生。

 

3、使用方法

sql语句:

OPTIMIZE TABLE table_name;

如果是多张表:

OPTIMIZE TABLE table1, table2, table3;