事发过程:
api_log这是一个api的接口日志表,随着时间的积累已经有100万多条数据,大小约10个多G,于是我想着删除下里面的数据,减少磁盘的占用情况,磁盘快满了都。但是我清空完毕里面的数据发现磁盘占用并没有减少。
问题原因:
delete命令并不会把记录删除,他只会把记录头信息里的delete_mask标识改为1,这些被“删除”的记录之所以不立即从磁盘上移除,是因为移除它们之后把其他的记录在磁盘上重新排列需要性能消耗,所以只是打一个删除标记而已,所有“被删除掉”的记录都会组成一个所谓的垃圾链表,在这个链表中的记录占用的空间称之为所谓的可重用空间,之后如果有新记录插入到表中的话,可能把这些被删除的记录占用的存储空间覆盖掉。
解决方案1:
optimize table api_log;
只是此命令会锁表,想通过此命令优化表结构,只能在访问量小的时候,或者停机的时候的使用。只是此命令会锁表,想通过此命令优化表结构,只能在访问量小的时候,或者停机的时候的使用。
解决方案2:
Alter table api_log engine=innodb;
这个命令就比较厉害了,相当于新建临时表、把旧表插到临时表里、交换表名、删除旧表,并且不锁表还不影响原表的增删改,比较推荐,当然在操作的时候,还是推荐在业务低峰期的时候。以免发生意外。
解决方案3:
把这个表导出,然后删除这个表,然后在导入这个表。