Eu tenho duas tabelas no meu MariaDB (10.4.12) que armazenam imagens (JPEG). Eles são mediumblob
s, normalmente em torno de 1 MB cada (embora varie). Quando uma nova imagem chega, ela é colocada na TempImages
mesa onde fica por... menos de um minuto. Geralmente 10-20 segundos. Em seguida, ele é movido para a FinalImages
mesa onde é mantido até o fim dos tempos.
As imagens aparecem raramente - uma a cada poucos minutos - então a TempImages
mesa está realmente vazia na maior parte do tempo. Do jeito que está atualmente, o pior que poderia ter são talvez 20 imagens ao mesmo tempo, e isso já está aumentando.
No entanto, por algum motivo, esta tabela continua a crescer. Ontem, ele atingiu mais de 30 GB de tamanho, então o descartamos e o recriamos porque o espaço em disco estava ficando escasso. Mas hoje já atingiu 150MB.
A engine é InnoDB (há transações envolvidas ao inserir/excluir na tabela) e innodb_file_per_table=ON
.
Por que o InnoDB não reutiliza o espaço vazio na tabela, mas continua aumentando o tamanho do arquivo?
Aqui está o script de criação completo, talvez haja alguns detalhes extras importantes lá:
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;
(Nota: isso não é o mesmo que não liberar espaço em disco . Espero que o espaço em disco permaneça alocado para a tabela, mas também espero que as novas linhas reutilizem o espaço que sobrou pelas linhas excluídas, conforme explicado no link pergunta. Por alguma razão, isso não está acontecendo.)
(Nota preventiva: a fragmentação também não deve ser um problema, pois a tabela está literalmente vazia na maioria das vezes)
Isso foi respondido em https://www.reddit.com/r/mariadb/ , mas para registro aqui também, a solução é atualizar para uma versão mais recente do MariaDB, pois isso foi corrigido em https://jira .mariadb.org/browse/MDEV-23072