Pergunta

O que faz exactamente nula fazer desempenho e armazenamento (espaço) sábio no MySQL?

Por exemplo:

TINYINT: 1 Byte TINYINT w / NULL 1 byte + alguma forma lojas NULL?

Foi útil?

Solução

Depende de qual mecanismo de armazenamento que você usa.

No formato MyISAM, cada cabeçalho de linha contém um campo de bits com um bit para cada coluna de estado de codificação NULL. Uma coluna que é NULL ainda ocupa espaço, então de NULL não reduzir o armazenamento. Consulte https://dev.mysql.com/doc/internals/en/ myisam-introduction.html

InnoDB, cada coluna tem um "início campo de deslocamento" no cabeçalho da linha, que é um ou dois bytes por coluna. A alta pouco nesse início de campo offset é sobre se a coluna for NULL. Nesse caso, a coluna não precisam ser armazenados em tudo. Então, se você tem um monte de NULL é o seu armazenamento deve ser significativamente reduzido. Consulte https://dev.mysql.com/doc/internals/ en / InnoDB-field-contents.html

EDIT:

Os bits nulos são parte dos cabeçalhos de linha, você não escolher para adicioná-los.

A única maneira que eu posso imaginar nulos melhorar o desempenho é que, em InnoDB, uma página de dados pode caber mais linhas se as linhas contêm nulos. Assim, seus buffers InnoDB pode ser mais eficaz.

Mas eu ficaria muito surpreso se isso proporciona uma vantagem de desempenho significativa na prática. Preocupar-se com o efeito nulos têm sobre o desempenho é no campo da micro-otimização. Você deve focar sua atenção em outros lugares, em áreas que dão maior retorno para os investimentos. Por exemplo a adição de índices bem escolhidos ou aumentar a alocação de cache do banco de dados.

Outras dicas

A resposta de Bill é bom, mas um pouco desatualizado. O uso de um ou dois bytes para armazenar NULL aplica única para formato de linha InnoDB redundante. Desde usos MySQL 5.0.3 InnoDB COMPACT formato de linha que usa apenas um bit para armazenar um NULL (claro que um byte é o mínimo), por isso:

espaço necessário para nulos = TECTO (N / 8) bytes em que N é o número de colunas NULL em uma fileira.

  • 0 NULLS = 0 bytes
  • 1 - 8 NULLS = 1 byte
  • 9 - 16 NULOS = 2 bytes
  • 17 - 24 NULOS = 3 bytes
  • etc ...

De acordo com o site do MySQL oficial sobre COMPACT vs REDUNDANT:

O formato de linha compacta diminui o espaço de armazenamento linha por cerca de 20% no custo de aumentar o uso da CPU para algumas operações. Se a sua carga de trabalho é um típico que é limitado por taxas de acerto de cache e velocidade de disco, formato compacto é provável que seja mais rápido.

Vantagem de usar NULLS mais vazio Cordas ou Zeros:

  • 1 NULL requer 1 byte
  • 1 esvaziar cadeia requer um byte (assumindo VARCHAR)
  • 1 Zero requer 4 bytes (assumindo INT)

Você começa a ver as economias aqui:

  • 8 nulos requerem 1 byte
  • 8 Cordas vazias requer 8 bytes
  • 8 Zeros requer 32 bytes

Por outro lado, eu sugiro usar nulos sobre strings vazias ou zeros, porque eles são mais organizados, portátil e necessitam de menos espaço. Para melhorar o desempenho e economizar espaço, o foco sobre o uso dos próprios tipos de dados, índices e consultas em vez de truques estranhos.

Mais em: https://dev.mysql.com/doc/refman /5.7/en/innodb-physical-record.html

Concordo com Bill Karwin, embora eu gostaria de acrescentar estas dicas MySQL . Número 11 endereços isso especificamente:

Em primeiro lugar, pergunte-se se há alguma diferença entre ter um valor de cadeia vazia vs. um valor NULL (para campos INT: 0 vs. NULL). Se não há nenhuma razão para ter os dois, você não precisa de um campo NULL. (Você sabia que a Oracle considera NULL e string vazia como sendo o mesmo?)

colunas NULL necessitar de espaço adicional e podem adicionar complexidade às suas declarações de comparação. Apenas evitá-los quando puder. No entanto, eu entendo algumas pessoas podem ter razões muito específicas para ter valores nulos, o que nem sempre é uma coisa ruim.

Por outro lado, eu ainda utilizar nulo em tabelas que não têm toneladas de linhas, principalmente porque eu como a lógica de dizer NOT NULL.

Atualizar Revisitando isso mais tarde, gostaria de acrescentar que eu, pessoalmente, não gosto de usar 0 em vez de NULL no banco de dados, e eu não recomendo. Isso pode facilmente levar a um monte de falsos positivos em sua aplicação se você não for cuidadoso.

dev.mysql.com/doc/refman/ 5.0 / en / é nulo-optimization.html

MySQL pode executar a mesma otimização em column IS NULL que ele pode usar para col_name = constant_value. Por exemplo, o MySQL pode utilizar índices e faixas de pesquisa para NULL com IS NULL

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top