我设置了一个 mariadb 数据库来记录实验数据。在其中一个表中,我每行都存储了巨大的原始图像。由于每行包含 3 张 512*512px 图像,几百万行数据已经耗尽了磁盘空间。我有 12TB 的磁盘,数据库已经占用了约 10TB。图像之间的差异很小,所以我相信有很大的压缩空间。我想考虑压缩数据库,但由于可用空间有限,我想要一种方法来就地压缩它。我在 Ubuntu 20.04 上使用 mariadb 10.3.39。我不是数据库专家,但我很乐意学习更多。我试过:
ALTER TABLE images ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8 ALGORITHM=INPLACE;
我得到了:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ALGORITHM=INPLACE' at line 1
我还考虑过是否可以将表分成多个块,然后单独压缩每个分区。但是我也不确定对现有表进行分区是否需要更多空间。在盲目尝试之前,我想得到一些建议。
简短回答:否
长答案:
INPLACE
这行不通。PARTITION
您的 10GB 会占用多余的 10GB(您没有)。PARTITION
;这消除了分区的假设好处。这是一个想法...
PRIMARY KEY
。读取 blob、压缩它们,然后将它们存储回表中。这将花费很长时间,而且显然不会节省磁盘空间。(稍后会详细介绍。)INSERTs
。警告:BLOB 列可能存储在“非记录”中;我不知道释放的块是否可以重新使用。因此我建议进行一些测试。或者...
如果您可以接受删除“旧”行,请参阅此内容以了解如何以最小的影响执行此操作: https ://mysql.rjweb.org/doc.php/deletebig
基本上,即使是好的压缩图像,如果它完美无缺,也会比压缩的行更好。
但由于 MARIAFB 不支持ALTER TABLE中的压缩
你可以做的是
小提琴