Tenho uma tabela com 2 colunas. O tipo de ambas as colunas é definido como varchar(38)
. Se eu criar uma linha com um valor vazio para uma das colunas, ela ocupará o mesmo espaço de armazenamento como se o valor não estivesse vazio?
Em outras palavras, o MySQL reservará espaço de armazenamento para a coluna (dependendo de seu tipo) quando uma linha for criada?
Da estrutura de linha física do Innodb, marcador nº 7 em REDUNDANT ROW_FORMAT
Da estrutura de linha física do Innodb, marcador nº 2 em COMPACT ROW_FORMAT
Com base nesses marcadores, veja o que um
NULL
valor ocupa para o armazenamento de uma colunaAgora, você deve decidir entre usar CHAR e VARCHAR por causa do que o primeiro ponto trouxe
Isso evitará a introdução de qualquer fragmentação de uma linha no caminho depois que os dados não NULL forem armazenados. Isso é algo que discuti antes com relação ao MyISAM: Veja meu post antigo Qual é o impacto no desempenho de usar CHAR vs VARCHAR em um campo de tamanho fixo? .
Independentemente do comprimento que você definir para sua coluna varchar, o espaço de armazenamento usado por uma coluna vazia será o mesmo.
Os tipos CHAR e VARCHAR
Isso aborda apenas o espaço usado pela coluna varchar e não considera o espaço de armazenamento total usado pela linha, seus índices, chaves primárias e outras colunas.
Como ypercube menciona em seu comentário, há considerações adicionais para o armazenamento de linhas como um todo quando pelo menos uma coluna anulável está presente.
Estrutura de linha física do Innodb
E sim, o espaço de armazenamento usado muda com base no tipo que você escolhe, é fixo ou variável, o agrupamento e outros fatores, como o mecanismo.
O MySQL faz recomendações sobre como otimizar o armazenamento de dados aqui : Otimizando o tamanho dos dados
Atualizar
Uma consideração adicional com varchar e isso é memória. É importante no MySQL limitar o tamanho de uma coluna de comprimento variável o máximo possível. Mesmo que a coluna seja variável e o espaço de armazenamento usado seja variável, o MySQL alocará memória em blocos fixos para armazenar valores. Por exemplo, varchar(200) usará mais memória que varchar(5). Este não é um problema de espaço de armazenamento, mas ainda é algo a ser considerado ao definir suas colunas.