Estou descobrindo qual é a melhor maneira de estimar o tamanho de uma tabela para que estudei muitos blogs e fóruns, mas não consegui encontrar nenhuma resposta precisa
Por exemplo, temos uma tabela City with InnoDB engine , digamos que no futuro (no próximo 1 ano) ele terá 1 milhão de registros, então qual será o tamanho estimado dos dados e o tamanho do índice dessa tabela nesse período.
mysql> desc City;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| Name | char(35) | NO | | | |
| CountryCode | char(3) | NO | MUL | | |
| District | char(20) | NO | | | |
| Population | int(11) | NO | | 0 | |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.03 sec)
ATUALIZAR
Qual será o limite superior estimado (tamanho máximo da tabela) com 1 milhão de registros e como podemos estimar.
Respostas:
Dada a descrição da tabela, vejo
Para um milhão de linhas, isso equivaleria a 77.000.000 bytes (73,43 MB)
Quanto à medição da tabela, para uma determinada tabela mydb.mytable, você pode executar esta consulta
Para medir todas as tabelas agrupadas por banco de dados e mecanismo de armazenamento
Execute essas consultas e poderá acompanhar as alterações no uso do disco do banco de dados / mecanismo.
De uma chance !!!
fonte
CHAR
comprimentos precisam ser multiplicados por 3, se você tiverCHARSET utf8
. A sobrecarga inteira pode ser estimada duplicando ou triplicando o cálculo.ALTER TABLE ... ENGINE=InnoDB;
) para obter uma proporção precisa. O esforço pode não valer a pena.Se você estiver usando tabelas do InnoDB, poderá obter o tamanho dos dados / índices individuais
mysql.innodb_index_stats
. A estatística 'size' contém a resposta, em páginas, portanto você deve multiplicá-la pelo tamanho da página, ou seja, 16K por padrão .O índice PRIMARY é os próprios dados.
fonte
Ao executar esta consulta, você pode obter o tamanho usado para
Data
eIndex
de uma tabela. Você pode verificar esse tamanho em relação ao número de linhas e prever 1 milhão de linhasfonte
Se você ainda não possui dados, aqui estão algumas dicas. O seguinte se aplica ao InnoDB. (MyISAM é muito mais simples e menor.)
Não use
CHAR
para colunas de comprimento variável. O queCHARACTER SET
você está usando? Ascii precisa de um byte por caractere; utf8mb4 precisa entre 1 e 4.Total = cerca de 80 bytes.
Multiplique o 80 por 2 e 3 para contabilizar várias despesas gerais. Provavelmente, a tabela de 1 milhão de linhas estará entre 160 MB e 240 MB.
Para medir um único índice, por exemplo,
CountryCode
3 bytes:Notas:
Somente os nós folha (de BTrees) precisam ser calculados; a sobrecarga para os nós não-folha é tipicamente 1%.
O
PRIMARY KEY
é "agrupado" com os dados, portanto não há necessidade de calculá-los.Se você não tiver uma PK explícita, precisará adicionar 6 bytes ao tamanho da linha para permitir a PK fabricada.
ROW_FORMAT = COMPRESSED
fornece um encolhimento 2: 1. (Isso não é tão bom quanto a taxa de compactação típica de zip (etc) de 3: 1.)SHOW TABLE STATUS LIKE "tablename";
é a maneira rápida de calcular o tamanho 'real'. VejaData_length
para dados e PK;Index_length
para índices secundários eData_free
para outras coisas.É raro
Index_length
excederData_length
. No entanto, não é "errado" que isso aconteça.fonte
É entediante. Mas os detalhes estão nos documentos .
Para ser o mais preciso possível, o que raramente é necessário, você também precisará ler sobre a estrutura da tabela e a estrutura do índice.
Se você estivesse no seu lugar, criaria a tabela, preencheria-a com um milhão de linhas de dados de teste e mediria a alteração no tamanho. Dependendo do seu aplicativo, talvez seja necessário levar em consideração o tamanho dos arquivos de log de transações.
fonte