Eu tenho uma tabela que, por razões históricas, contém alguns conteúdos HTML e PDF. Ele também contém nomes de arquivo/URLs caso o conteúdo HTML e PDF tenha sido gravado no armazenamento.
Atualmente, o aplicativo gravará o PDF e o HTML na tabela, depois outro processo os lerá, os gravará no disco e os colocará NULL
nos campos de conteúdo HTML e PDF.
Meu banco de dados está ficando muito grande e custando mais do que eu esperava e estou me perguntando se esse armazenamento não está sendo liberado corretamente. Eu tenho duas perguntas:
- Posso validar esta teoria? Atualmente, estou olhando
information_schema.TABLES.DATA_LENGTH
eINDEX_LENGTH
vendo o espaço sendo usado pela mesa, mas não tenho certeza se entendi completamente isso e oDATA_FREE
valor. - Se for a gravação desses BLOBs médios/pequenos que está causando o problema, posso forçá-los para armazenamento externo com base no fato de que eles serão configurados posteriormente
NULL
?
Resposta curta: o MySQL não tem controle sobre a localização do BLOB, mas sua solução é boa.
Resposta longa:
Não, embora o InnoDB coloque big
BLOBs
em um lugar diferente, você não tem controle sobre esse mecanismo de armazenamento "off-record". E você deve continuar a usarINSERT
,SELECT
, etc para acessá-los.O problema é que um tablespace InnoDB só aumenta de tamanho; ele nunca encolhe, exceto por
OPTIMIZE TABLE
(ou ações equivalentes específicas).Como já mencionado,
OPTIMIZE TABLE
dará espaço de volta ao SO, caso a tabela tenha sido criada cominnodb_file_per_table = ON
. Mas pode demorar muito. Digo "pode" porque ele só precisa copiar o que sobrou, mais alguns bytes para os NULLs que você deixou para trás. Portanto, pode não demorar muito depois que todos os blobs forem removidos.Em geral, (como você supôs), é melhor jogar pdfs e htmls no disco e deixar que outros htmls os busquem por meio de
<img src=...>
coisas semelhantes.E, sim, o "outro lugar" poderia facilmente ser algum outro servidor (mais barato?);
<img>
não se importa em qual máquina está alcançando.A redução do armazenamento csn pode ser feita usando o comando otimizar. O banco de dados geralmente diminuirá o espaço de armazenamento em tempo real porque terá um impacto adverso na velocidade de um sistema ativo
Do ponto de tutoriais
O armazenamento de blobs no banco de dados é feito pelo seu aplicativo. É uma escolha feita pelo desenvolvedor. Você pode alterar seu programa para armazená-los em arquivos separados