我有一个生产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
除了加法和减法,数据列也会经常更新。
答案 0 :(得分:0)
MyISAM将有一个不同的问题-碎片。删除后,表中有一个孔。首先填充孔。然后链接到下一条记录。最终,要获取一行将涉及到在桌子的大部分地方跳动。
如果300行占用100MB,则平均行333KB?相当大这个数字相差很大吗?您是否有很多text / blob列?他们经常改变吗?还是只是删除并添加?您是否愿意分享SHOW CREATE TABLE
。
我不认为如果不添加至少一个非常多GB的行然后删除该表,该表将如何增长900倍。也许有了该架构,我可能会想到一些原因和/或解决方法。