我的 MariaDB (10.4.12) 中有两个存储图像 (JPEG) 的表。它们是mediumblob
s,通常每个大约 1MB(尽管有所不同)。当一个新图像第一次到达时,它会被放置在TempImages
桌子上并停留......不到一分钟。通常为 10-20 秒。然后它被移到FinalImages
桌子上,一直保存到时间结束。
这些图像很少出现 - 每隔几分钟左右出现一次 - 所以TempImages
桌子实际上大部分时间都是空的。就目前而言,它可能拥有的绝对最糟糕的情况可能是同时拍摄 20 张图像,而这已经在推动它。
但是由于某种原因,该表继续增长。昨天它的大小已经超过 30GB,所以我们删除并重新创建了它,因为磁盘空间越来越少。但是今天它已经达到了 150MB。
引擎是 InnoDB(在表中插入/删除时涉及事务)和innodb_file_per_table=ON
.
为什么 InnoDB 不重用表中的空白空间而只是不断增加文件大小?
这是完整的创建脚本,也许那里有一些额外的重要细节:
CREATE TABLE `TempImages` (
`id` int(11) NOT NULL,
`image` mediumblob NOT NULL,
`small_image` mediumblob DEFAULT NULL,
`mime_type` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `FK_DATA` FOREIGN KEY (`id`) REFERENCES `TempData` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
(注意:这与不释放磁盘空间不同。我希望磁盘空间保持分配给表,但我也希望新行重用已删除行留下的空间,如链接中所述问题。由于某种原因,这没有发生。)
(先发制人:碎片也不应该是一个问题,因为桌子大部分时间都是空的)
这在https://www.reddit.com/r/mariadb/上得到了回答,但为了记录在这里,解决方案是更新到最新版本的 MariaDB,因为这已在https://jira中修复.mariadb.org/browse/MDEV-23072