从小的但使用频繁的MySQL 8表中回收空间

时间:2019-04-18 14:40:02

标签: mysql innodb diskspace mysql-8.0

我有一个生产mysql 8服务器,该服务器具有用于PHP应用程序的用户会话的表。我正在使用innodb_file_per_table。该表在任何给定时间都是很小的(大约300-1000行),但是不断地删除和添加行。在没有干扰的情况下,sessions.ibd文件会缓慢增长,直到占据所有可用磁盘空间为止。今天早上,这张桌子有300条记录,占用了90GB以上的空间。这是长期(几个月)积累的。

运行OPTIMIZE TABLE会回收所有磁盘空间,并将该表恢复到100M以下。一个简单的解决方案是制作一个在我们的维护期间每周运行一次OPTIMIZE TABLE的cron脚本。另一个建议的建议是将表转换为MyISAM表,因为它实际上不需要InnoDB的任何功能。这两种解决方案都应该有效,但是它们是针对特定表的,不能防止出现一般性问题。我想知道是否有解决此问题的解决方案,涉及数据库配置。

以下是我们使用的非默认innodb配置选项:

innodb-flush-log-at-trx-commit = 1
innodb-buffer-pool-size = 24G
innodb-log-file-size = 512M
innodb-buffer-pool-instances = 8

我们还应该使用其他选项,以便sessions.ibd文件不会持续增长吗?

这是该表的创建表:

CREATE TABLE `sessions` (
  `id` varchar(255) NOT NULL DEFAULT '',
  `data` mediumtext,
  `expires` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

除了加法和减法,数据列也会经常更新。

1 个答案:

答案 0 :(得分:0)

MyISAM将有一个不同的问题-碎片。删除后,表中有一个孔。首先填充孔。然后链接到下一条记录。最终,要获取一行将涉及到在桌子的大部分地方跳动。

如果300行占用100MB,则平均行333KB?相当大这个数字相差很大吗?您是否有很多text / blob列?他们经常改变吗?还是只是删除并添加?您是否愿意分享SHOW CREATE TABLE

我不认为如果不添加至少一个非常多GB的行然后删除该表,该表将如何增长900倍。也许有了该架构,我可能会想到一些原因和/或解决方法。