一次mysql表空间优化记录
场景:有个订单表,因为是按订单商品拆的数据,所以一个订单号会出现多行的情况。我们为了更新不漏数据(比如某订单删除了商品,但是根据订单号更新时会漏删除这些数据),我们就采用了先通过订单号删除数据,然后再将订单数据导入,插入的数据会有大量和删除的数据重复的数据。采用的是innodb索引 。按道理来说,执行optimize table是会减少很多表空间。但是, 我刚刚执行了optimize table,数据没有减少而是增加了,增加也可以理解,因为有预留空间。
第一次执行结果:
看来是没有执行成功,但是查询表空间反而增加了。初步来推测是,因为执行optimize table后会增加预留空间导致空间增加。
经过查资料,得知,默认mysql的InnoDB引擎是不支持 optimize table 的。需要重启,启动时增加--skip-new或--safe-mode参数。
于是,立马重启mysql服务。
然后,再次执行 optimize table 表。
再次查询表空间,发现空间从3229.98M变为了2675.00M(由于每天都会删除大量的数据,所以会留有很多的未回收空间,回收空间只有在牵扯到复制表时才会回收)。