Mysql中的Optimize table命令
作者:mmseoamin日期:2024-04-27

什么是optimizetable

在MySQL中,optimizetable命令用来重新整理(InnoDB & MyISAM)表格并优化空间利用。优化后的表更容易被访问,节省了磁盘空间,同时可以加速查询,以达到更好的性能。

手册中的相关描述

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] …

如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用

OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片。

在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次

即可,只对特定的表运行。

OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。

注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表。

换句话说,MySQL数据库的表格在不停的操作时间内产生的page分布是不均匀的,这就导致有的页变满就不能继续插入了,导致了表的碎片化以及空间的浪费。在进行大量数据的插入和删除时,会进一步加剧这种现象,使表格的性能下降。

通俗理解

当你删除数据时,mysql并不会回收被已删除数据的占据的存储空间以及索引位。而是空在那里,等待新的数据来弥补这个空缺,这样就有一个缺少,如果一时半会,没有数据来填补这个空缺,那这样就太浪费资源了。所以对于写比较频烦的表,要定期进行optimize,一个月一次,看实际情况而定了。

这时,就需要使用optimizetable重新压缩表格来回收空间和达到优化性能。

使用

mysql里输入以下命令:

OPTIMIZE TABLE table_name;

优化多个表:

OPTIMIZE TABLE [table1],[table2],......[tablen]; 

注意点

① 优化表格之前,最好备份一下表格的数据。如果数据非常庞大,优化时间可能需要很长时间。

② 在OPTIMIZE TABLE运行过程中,MySQL会锁定表。如果涉及海量的数据表,应该考虑使用一些运维手段避免现网的服务受到影响。

③ 使用alter table table_name engine=innodb 命令也可以同样达到释放空洞的效果。这是由于在转换数据引擎(即便没有真正转换)的时候,mysql也会将表中的数据读取出来,再重新写入,在这个过程中,空洞自然就没有了