Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL:NULL vs


Para tabelas MyISAM, NULL cria um bit extra para cada coluna NULLABLE (o bit nulo) para cada linha. Se a coluna não for NULLABLE, o bit extra de informação nunca será necessário. No entanto, isso é preenchido para bytes de 8 bits para que você sempre ganhe 1 + mod 8 bytes para a contagem de colunas NULLABLE. 1

As colunas de texto são um pouco diferentes de outros tipos de dados. Primeiro, para "" a entrada da tabela contém o comprimento de dois bytes da string seguido pelos bytes da string e é uma estrutura de comprimento variante. No caso de NULL, não há necessidade das informações de comprimento, mas elas são incluídas de qualquer maneira como parte da estrutura da coluna.

No InnoDB, NULLS não ocupa espaço:eles simplesmente não existem no conjunto de dados. O mesmo vale para a string vazia, pois os deslocamentos de dados também não existem. A única diferença é que os NULLs terão o bit NULL definido, enquanto as strings vazias não. 2

Quando os dados são realmente dispostos em disco, NULL e '' ocupam EXATAMENTE O MESMO ESPAÇO em ambos os tipos de dados. No entanto, quando o valor é pesquisado, a verificação de NULL é um pouco mais rápida do que a verificação de '', pois você não precisa considerar o comprimento dos dados em seus cálculos:você verifica apenas o bit nulo.

Como resultado das diferenças de espaço NULL e '', NULL e '' tem NO SIZE IMPACT, a menos que a coluna seja especificada para ser NULLable ou não. Se a coluna for NOT NULL, somente nas tabelas MyISAM você verá alguma diferença de desempenho (e então, obviamente, o NULL padrão não pode ser usado, então é uma questão discutível).

A verdadeira questão então se resume à interpretação da aplicação de colunas "nenhum valor definido aqui". Se o "" for um valor válido que significa "o usuário não digitou nada aqui" ou algo parecido, então o padrão NULL é preferível, pois você deseja distinguir entre NULL e "" quando um registro é inserido sem nenhum dado.

Geralmente, porém, o padrão é realmente útil apenas para refatorar um banco de dados, quando novos valores precisam entrar em vigor em dados antigos. Nesse caso, novamente, a escolha depende de como os dados do aplicativo são interpretados. Para alguns dados antigos, NULL é perfeitamente apropriado e o melhor ajuste (a coluna não existia antes, então agora tem valor NULL!). Para outros, "" é mais apropriado (geralmente quando as consultas usam SELECT * e NULL causam problemas de travamento).

Em ULTRA-GENERAL TERMS (e do ponto de vista filosófico), o padrão NULL para colunas NULLABLE é o preferido, pois fornece a melhor interpretação semântica de "Nenhum valor especificado".

1 [http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]

2 [http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]