Esta consulta imprime o tamanho (em termos de dados e índices) das tabelas em mydatabase :
SELECT table_name "Table name",
round(((data_length)/1024/1024),2) "Data size",
round(((index_length)/1024/1024),2) "Index size"
FROM information_schema.TABLES
WHERE table_schema="mydatabase" AND data_length>1000000
order by table_name INTO OUTFILE '/tmp/mydatabase_values'
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
Os tamanhos são impressos em Mb, sendo consideradas apenas tabelas maiores que 1Mb. As tabelas são listadas em ordem alfabética e a saída é salva em um arquivo CSV.
A execução dessa consulta em diferentes pontos no tempo mostrou - obviamente - resultados diferentes à medida que os dados foram alterados no banco de dados. No entanto, apenas nas últimas semanas a consulta produziu resultados idênticos. Isso significa que o tamanho do banco de dados não mudou muito (como você pode ver, o arredondamento é feito no limite de 10Kb) ou há algo que realmente estou perdendo? A pergunta pode parecer absurda, mas as visualizações INFORMATION_SCHEMA
sempre mantêm metadados atualizados?
Observação: não, não estou lendo todas as vezes o mesmo arquivo CSV por engano.
Editar: todas as tabelas são InnoDB e innodb_file_per_table=1
.
Sim, os dados estão atualizados. Mas não leia muito os números.
InnoDB, especialmente, pré-aloca espaço para linhas futuras. Assim, é bem possível olhar para o tamanho exato de uma tabela, inserir dezenas de linhas (talvez até milhares), então olhar para o tamanho novamente -- e ver exatamente o mesmo Data_length e Index_length.
Quando você cria uma tabela InnoDB e insere uma pequena linha, o comprimento dos dados será de 16384 bytes (um bloco de 16 KB). À medida que você adiciona mais linhas, eventualmente esse bloco transbordará e outro bloco será adicionado. Mais tarde (conforme a tabela excede algum limite), a tabela crescerá em unidades de (eu acho) 8 MB (uma "extensão"). Isso permitirá que ainda mais linhas sejam adicionadas sem alterar o volume do disco.
Além disso, a tabela foi criada com
innodb_file_per_table
ON ou OFF? Isso controla se o material vai para oibdata1
arquivo comum ou para o próprio.ibd
arquivo da tabela.E, como @jkavalik aponta, e
DELETE
pode mexer com o tamanho, novamente não necessariamente de maneiras previsíveis.UPDATE
ALTER
Editar
Esses são os tamanhos de "pegada de disco". Compare com o que você pode ver olhando para o sistema de arquivos.
Uma tabela de 1 linha com um de 4 bytes
INT
ocupa pelo menos 16384 bytes de espaço em disco. Se você está dizendo que "4" é o tamanho real , respondi à pergunta errada. Eu digo que 16KB é o tamanho real .Há sobrecarga para cada coluna, para cada linha, para cada bloco, para a estrutura BTree, para cada extensão, para índices, etc. E o InnoDB aloca nada menos que 16KB por vez. E espaço para 'desfazer' cópias de linhas. Portanto, "4" se transforma em "16384".
Como uma "regra prática", se você somar os tamanhos de dados (4 para INT, etc) das colunas em uma linha, multiplicar pelo número de linhas e, em seguida, multiplicar por algo entre 2 e 3, é provável que você obtenha o "tamanho" da tabela. (O exemplo de 1 coluna e 1 linha, é claro, é um caso final que excede 3x)