Problema:
Existe alguma maneira de calcular o número de bytes ocupados pela criação da tabela, eu sei que você pode obter algumas informações de 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 somente para innodb e o agrupamento também pode ser considerado como utf-8-general-ci
Por exemplo, um teste de tabela é o seguinte
criar teste de tabela
(
col1 varchar (25),
col2 int,
col3 varchar (3),
col4 char (15),
col5 datetime
);
Agora seria necessário conhecer o tamanho total da linha que pode ser acumulada em uma linha, de acordo com os tipos de colunas na tabela.
Encontrou algum tipo de solução semelhante no MSSQL, mas precisa da versão do MySQL
Script para estimar tamanhos de linha para qualquer tabela
Qualquer ajuda é muito apreciada.
fonte
Respostas:
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.
fonte
-uUser -pPass
às linhas de comando mysql e mysqldump no script (ou tente--defaults-extra-file=/etc/mysql/debian.cnf
no Ubuntu / Debian) e execute-o com um banco de dados como o primeiro argumento comoperl test.pl mydatabase
Você precisa conhecer o tamanho em bytes de cada campo, de acordo com o tipo de dados ( referência do MySQL aqui ), e depois resumir esses valores.
fonte
Passo 1:
20 caracteres em inglês: 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 esses itens.
Etapa 3: Multiplique em algum lugar entre 2 e 3 para permitir a sobrecarga do InnoDB. Eu descobri que esse fator geralmente funciona. (Mas não para tabelas pequenas, e não necessariamente para tabelas particionadas).
Não vejo razão para usar o tamanho máximo de cada coluna.
Você pode se aproximar mais
SHOW TABLE STATUS
ou ainformation_schema
dados equivalentes :Etapa 1:
SELECT COUNT(*)
- nos este no lugar deRows
Etapa 2: obtenha
Data_length + Index_length + Data_free
Etapa 3: Divida.
fonte
SELECT AVG(LENGTH(varchar_col))
- Nota:LENGTH
já é bytes ; não há necessidade de multiplicar por 2/3/4. (CHAR_LENGTH
Obtém o comprimento em caracteres.)Eu criei um script básico para calcular o tamanho da linha e avisar se ele ultrapassa o limite com base no esquema:
O que outras pessoas estão dizendo
fonte
Já existem algumas perguntas desse tipo, por exemplo: 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 cadeias de comprimento variável nas suas - lembre-se de levar em consideração o tamanho máximo que elas podem ter.
Lembre-se também de que da versão 5 em diante, com
varchar(25)
até 25 caracteres e não 25 bytes, portanto, se é provável que você veja caracteres não ASCII em suas seqüências, o tamanho da coluna pode aumentar até 100 bytes, porque alguns caracteres ocupam quatro bytes representar - por exemplo, "pilha de cocô de emoji" (que, como eu não acredito, existe) - se o seu navegador + fonte atual parecer com: is) é 0xF0 0x9F 0x92 0xA9. Antes da v5, o mySQL contava bytes, não caracteres, ao especificar comprimentos de tipo de sequência.Editar em relação à automação
Em termos de automatização do processo, você deve conseguir derivar todas as informações necessárias das
INFORMATION_SCHEMA
tabelas de maneira semelhante ao script encontrado para o MS SQL Server. Consulte https://dev.mysql.com/doc/refman/5.0/en/information-schema.html para obter alguma documentação sobre isso.fonte
INFORMATION_SCHEMA
tabelas devem incluir as informações necessárias. Consulte dev.mysql.com/doc/refman/5.0/en/information-schema.html para obter alguma documentação sobre isso.