Existe alguma maneira de calcular o número de bytes ocupados pela tabela? Eu sei que você pode obter algumas informações, information_schema.tables
mas essas informações não são precisas o suficiente.
O que realmente é necessário é o número de bytes de acordo com a definição da tabela apenas para InnoDB e o agrupamento também pode ser considerado como utf-8-general-ci .
Por exemplo, uma tabela test
é a seguinte
create table test (
col1 varchar(25),
col2 int,
col3 varchar(3),
col4 char(15),
col5 datetime
);
Eu precisaria saber o tamanho total da linha que pode ser acumulada em uma linha, de acordo com os tipos de colunas da tabela.
Encontrou algum tipo de solução semelhante para o MS SQL Server, mas precisa da versão do MySQL
Depois de muito pensar e pesquisar encontrei uma resposta que realmente ajudou a alcançar o que era necessário. É um script perl e o link de referência é
http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html
Obrigado a todos pela grande ajuda.
Passo 1:
20 caracteres ingleses: 2 + 1*20
20 caracteres do Oriente Médio / eslavos: 2 + 2*20
20 caracteres asiáticos: 2 + 3*20
20 caracteres emoji: 2 + 4*20 (e você precisa
utf8mb4
)Etapa 2: adicione-os.
Etapa 3: multiplique por algo entre 2 e 3 para permitir a sobrecarga do InnoDB. Descobri que esse fator geralmente funciona. (Mas não para mesas pequenas e não necessariamente bem para tabelas particionadas.)
Não vejo razão para tomar o tamanho máximo de cada coluna.
Você pode se aproximar
SHOW TABLE STATUS
ou os dados equivalentesinformation_schema
:Etapa 1:
SELECT COUNT(*)
-- use isso no lugar deRows
Etapa 2: obter
Data_length + Index_length + Data_free
Passo 3: Divida.
Aqui estão meus dois centavos usando SQL e consultando a tabela INFORMATION_SCHEMA.COLUMNS, com base na documentação do MySQL ' Data type storage requirements '.
Nota : isso não é totalmente preciso, pois os tamanhos das colunas ENUM e SET dependem do número de valores de enumeração, respectivamente, de membros definidos. Aqui usei os valores "pior caso" (2 e 8 bytes respectivamente), isso já dá uma boa dica sobre o tamanho da linha. Pode-se analisar o INFORMATION_SCHEMA.COLUMNS.COLUMN_TYPE para obter o número de valores de enumeração/membros do conjunto para essas colunas e, em seguida, calcular a quantidade de bytes com base no que a documentação diz.
Você precisa saber o tamanho em bytes de cada campo de acordo com o tipo de dados ( referência MySQL aqui ), então some esses valores juntos.
Eu fiz um script bash áspero para calcular o tamanho da linha e avisar se passar do limite com base no esquema:
Já existem algumas perguntas desse tipo, por exemplo esta: Como estimar/prever o tamanho dos dados e o tamanho do índice de uma tabela no MySQL
Uma diferença entre essa pergunta e sua tabela é a presença de strings de comprimento variável na sua - lembre-se de levar em conta o tamanho máximo que elas podem ter.
Lembre-se também de que, a partir da versão 5, isso
varchar(25)
tem até 25 caracteres e não até 25 bytes , portanto, se for provável que você veja caracteres não ASCII em suas strings, o tamanho da coluna pode aumentar até um máximo de 100 bytes porque alguns caracteres ocupam quatro bytes para representar - por exemplo "pilha de emoji de cocô" (que, eu não estou brincando, existe - se o seu navegador + fonte atual suportar, parece: ?) é 0xF0 0x9F 0x92 0xA9. Antes da v5, o mySQL contava bytes e não caracteres ao especificar comprimentos de tipo de string.Editar em relação à automação
Em termos de automatização do processo, você deve ser capaz de derivar todas as informações necessárias das
INFORMATION_SCHEMA
tabelas de maneira semelhante ao script encontrado para o MS SQL Server. Veja https://dev.mysql.com/doc/refman/5.0/en/information-schema.html para alguma documentação sobre isso.