Comecei a testar alguns bancos de dados MySQL 5.7 para substituir nossos bancos de dados 5.5 antigos e parece haver uma mudança significativa na maneira como a information_schema.tables
tabela registra o tamanho dos dados.
Eu executo a seguinte consulta:
SELECT
table_schema AS table_schema,
table_name AS table_name,
(data_length + index_length + data_free) AS table_size,
ROUND((data_length + index_length + data_free)/POWER(1024,3),2) AS table_sizeGB,
t.data_length,
t.index_length,
t.data_free
FROM information_schema.TABLES t
WHERE table_schema = 'myDb'
ORDER BY table_size DESC, table_name
LIMIT 10;
Isso me dá as 10 maiores tabelas. Eu corro isso diariamente para registrar o crescimento ao longo do tempo. No MySQL 5.5 leva apx 5 segundos, no MySQL 5.7 é instantâneo.
No MySQL 5.5 recebo o seguinte resultado para a maior tabela:
myDb | myTable | 319383535616 | 297.45 | 319116279808 | 262012928 | 5242880
No MySQL 5.7 eu recebo:
myDB | myTable | 270051115008 | 251.50 | 269824819200 | 226295808 | 0
Ambos os bancos de dados foram criados com poucos dias de intervalo. O banco de dados 5.7 é um escravo do banco de dados 5.5. Nenhum deles está ativo ainda (apenas sentado como escravo do Sistema Ativo).
Se eu olhar no servidor, o arquivo .ibd das tabelas tem 302 GB no banco de dados 5.5 e 292 GB no banco de dados 5.7.
Eu esperava uma pequena discrepância (um está usando o Antelope, o formato Barracuda File - ambos são innodb). Os dados estão sendo constantemente adicionados ao banco de dados e muito pouco (se houver) está sendo removido.
No banco de dados MySQL 5.5, posso ver os números aumentarem cada vez que executo a consulta, mesmo com apenas alguns segundos de intervalo. Mas no MySQL 5.7, os números não mudaram desde que comecei a olhar para ele, há uma semana.
Este é um comportamento correto? Existe uma maneira melhor de monitorar isso no MySQL 5.7 que eu perdi?
-- ATUALIZADO 2018-10-16
Após três semanas, o resultado da consulta ainda é praticamente o mesmo no MySQL 5.7:
5.5 -- myDb | myTable | 327890632704 | 305.37 | 327616036864 | 268304384 |6291456
5.7 -- myDb | myTable | 270055309312 | 251.51 | 269824819200 | 226295808 | 4194304
O tamanho físico no servidor é 310 GB no MySQL 5.5 e 300 GB no MySQL 5.7.
Ambas as tabelas são criadas de forma idêntica.
Nenhum banco de dados está ativo ainda, portanto, as únicas consultas em execução (além do meu teste) são da replicação.
Ambos os bancos de dados usam innodb_file_per_table
.
O MySQL 5.5 foi copiado de um slave ativo usando mysqldump.
O banco de dados 5.7 foi copiado do banco de dados MySQL 5.5 usando mysqldump + mysql_upgrade.
A tabela de otimização nunca foi executada nessas tabelas.
Resposta curta: Os números estão próximos; não se preocupe.
Resposta longa:
Há muitas explicações.
ROW_FORMAT
?SELECTs
pode causar bloqueio que leva à fragmentação extra de inserções/atualizações/exclusões.innodb_file_per_table
o mesmo?OPTIMIZE TABLE
em qualquer máquina. (Não há praticamente nenhuma razão para fazer isso.)Também,