前言:最近无心中发现mysql数据库中的A表的空闲数据比较大1.7G,回想一下,是由于A表在最近几个月由于表数据增加快,进行了两次分表,把里面的部分数据从原表DELETE后,INSERT到一个新表里,所以产生了碎片所致。这无疑会影响索引的使用率,因此咱们须要优化一下。mysql
使用场景:若是您已经删除了表的一大部分,或者若是您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了不少更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在连接清单中,后续的INSERT操做会从新使用旧的记录位置。您可使用OPTIMIZE TABLE来从新
利用未使用的空间,并整理数据文件的碎片。【当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并无减少。这是由于删除操做后在数据文件中留下碎片所致。】sql
在多数的设置中,您根本不须要运行OPTIMIZE TABLE。即便您对可变长度的行进行了大量的更新,您也不须要常常运行,每周一次或每个月一次便可,只对特定的表运行。数据库
OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起做用。优化
对于BDB表,OPTIMIZE TABLE目前被映射到ANALYZE TABLE上。对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表。重建操做能更新索引统计数据并释放成簇索引中的未使用的空间。spa
注意:在OPTIMIZE TABLE运行过程当中,MySQL会锁定表。索引
对于myisam能够直接使用 optimize table table.name, 当是InnoDB引擎时,会报“Table does not support optimize, doing recreate + analyze instead”,通常状况下,由myisam转成innodb,会用alter table table.name engine='innodb'进行转换,优化也能够用这个。因此当是InnoDB引擎时咱们就用alter table table.name engine='innodb'来代替optimize作优化就能够。innodb