![Requisitos de armazenamento para coluna MySQL TEXT](https://rvso.com/image/1366212/Requisitos%20de%20armazenamento%20para%20coluna%20MySQL%20TEXT.png)
Eu tenho uma tabela MySQL chamada errormsg2
usando o mecanismo de armazenamento MyISAM com cerca de uma dúzia de colunas.
Duas dessas colunas que estimo representam a maior parte do espaço usado para cada linha e são do tipo de dados TEXT. Eles são backtrace
e msg
.
Estou tentando estimar a quantidade de armazenamento necessária para cada linha e me deparei com a seguinte contradição:
show table status where name = 'errormsg2';
mostra que (data_length + index_length) / rows
são cerca de 778 bytes por linha.
select avg( bit_length( em.backtrace ) + bit_length( em.msg ) ) / 8 from errormsg2 em;
mostra uma média de 899 bytes de texto por linha apenas dessas duas colunas.
Como é possível que a tabela armazene mais dados do que utiliza? o que estou perdendo?
Responder1
Uma coisa a considerar são os problemas de codificação. UTF-8, por exemplo, usa 5 bytes para alguns caracteres. Se você não tiver dados, ou dados variáveis, o banco de dados será forçado a assumir o pior: que cada caractere pode ter 5 bytes de comprimento. Assim, pode alocar mais do que realmente precisa usar.
Observe que o UTF-16, embora supostamente tenha apenas 2 bytes, também pode ser vítima do mesmo tipo de problema: ele precisa codificar pares substitutos, que têm 4 bytes de comprimento. UTF-16 tem vários outros problemas ealgunsdefenda sempre o uso de UTF-8