我希望有人可以解释为什么两小时的数据清除据称导致我的mysql实例上的数据使用量减少了32 KB。以下是我的详细信息:
我有一个mysql数据库(在Amazon RDS上运行),我试图清除数据。我这样做是为了避免耗尽存储空间,因为亚马逊会限制你1TB,如果我们不采取任何行动,我们最终会达到这个限制。
我正在使用此命令来计算表格和索引的大小:
select * from information_schema.tables;
特别是有两个InnoDB表占用了我的大部分存储空间。我有一个进程迭代我最大的表删除记录。在时间t = 0时,我运行了上面的SQL查询,得到了数据长度和索引数据长度的以下结果:
两小时后,在连续运行数据库清理程序之后,我运行了上面的SQL语句并得到了以下内容:
这基本上意味着我削减了32 KB的表数据和102 MB的索引数据。
指数的减少是有道理的。表格数据的减少非常小。在此期间不可能插入其他数据,因为我在我的数据库的备份副本上运行此测试(关于RDS的一个好处是,您可以完全复制数据库并运行以运行实验在,例如这一个)。我还确认AUTO_INCREMENT值两次都是相同的。
有人可以解释为什么数据长度没有太大变化吗?数据长度只是一个非常快速和肮脏的近似值吗? mysql最终会有其他一些压缩步骤吗?或者我是否完全误解了这些领域的使用?
谢谢!
更新
我可能已经弄清楚了 - 在时间t = 0
四小时后,
这意味着我已经将DATA_FREE增加了大约171MB。
这是否意味着如果我插入另一个171MB,它将来自DATA_FREE池,所以我的数据长度不会增加?
换句话说,让我说我从一个新的InnoDB表开始并插入20 GB的数据(假设20 GB包含了所有多余的InnoDB内容,我意识到InnoDB中存储的数据比MyISAM大),然后我删除所有数据,然后我插入10 GB的数据。当我从information_schema.tables运行select *时,我应该看到10 GB的数据长度和10 GB的数据,对吧?我不应该期望看到数据长度为30 GB /数据的0 GB,也不应该期望看到数据长度为10 GB / 10 GB的数据?
更新2
This post on Stack Overflow似乎也证实了我的分析。
答案 0 :(得分:3)
表的“数据长度”包括表中可能存在的任何空闲空间。您可能需要OPTIMIZE
表对表进行碎片整理,从而释放该空间。请注意,这可能会锁定表格一段时间。
使用InnoDB存储引擎(CREATE TABLE ( ... ) ENGINE=InnoDB;
)将使表优化变得非常不必要,并且使数据库通常更快。如果你还没有使用它,你应该开始。 :)