NULL ou NOT NULL por padrão?

41

No MySQL, é melhor sempre permitir nulos, a menos que você saiba que um campo é obrigatório, ou sempre usar, a Not Nullmenos que saiba que um campo conterá nulos? Ou isso não importa?

Eu sei que em alguns DBMSs eles dizem usar Not Nullo máximo possível, porque permitir nulos requer um bit extra (ou byte?) Por registro para armazenar o status Nulo.

BenV
fonte
1
Você deve permitir NULLse e somente se o NULLvalor tiver uma interpretação para a coisa que você está modelando.
Jameshfisher 21/03

Respostas:

25

Na maioria dos bancos de dados, uma NOT NULLcoluna será mais eficiente em termos de dados armazenados pelo motivo que você declara, e também mais eficiente para consultar e indexar - portanto, a menos que você deseje permitir NULLs em uma coluna, desabilite-os explicitamente.

Haverá uma pequena implicação no desempenho, já que as NOT NULLrestrições extras precisarão ser verificadas para cada linha que você afetar com qualquer INSERT ou UPDATE, mas como a maioria dos bancos de dados é relativamente leve para gravação e pesada para leitura, isso provavelmente não é uma preocupação (a pequena é improvável que ocorra um tempo extra de qualquer maneira, pois é uma operação vinculada à CPU, onde o restante da operação de inserção / atualização será vinculado à IO e, portanto, um gargalo muito mais significativo) e oferece alguns "recursos gratuitos" "verificação de dados para que seu código (ou o código de outras pessoas) não possa acidentalmente colocar NULLs onde outro código não os espera e, portanto, pode dar resultados incorretos na presença deles.

Edit: Como Peter aponta em seu comentário, o acima é um generalismo e pode não ser verdadeiro para todos os DMBSs, embora eu tenha certeza que isso ocorre para o mysql e o mssql. Outras complicações na área podem incluir recursos como tabelas esparsas (como o MSSQL 2008 implementado, por exemplo) que alterarão a dinâmica de desempenho de colunas (não) anuláveis.

David Spillett
fonte
8
Isso não é necessariamente verdade no PostgreSQL. As colunas nulas economizam espaço, o que pode melhorar a velocidade, e o tempo de processamento deve ser o mesmo.
Peter Eisentraut
4
Isso também não é verdade para o Oracle. Além disso, diferentemente do MySql, o Oracle não indexa nulos, portanto você pode reduzir o tamanho dos seus índices usando-os. Veja stackoverflow.com/questions/289001/does-mysql-index-null-values
Leigh Riffel
8

Você deve permitir que o design do esquema e os requisitos do aplicativo guiem essa decisão. As diferenças de desempenho provavelmente não são visíveis de qualquer maneira na maioria dos casos.

Peter Eisentraut
fonte
3
Mais uma vez, a melhor maneira de saber com certeza é a criação de perfil e o teste.
jcolebrand
Eu seria cuidadoso com essas declarações amplas - se você estiver escrevendo 10 milhões de linhas por noite em uma tabela por algum processo ETL e essa tabela tiver vários campos restritos Não Nulos, você verá os impactos no desempenho.
precisa saber é o seguinte
1
+1: Talvez não seja verdade para todos os aplicativos, mas o que estou fazendo é obter dados consistentes / corretos é mais importante do que economizar espaço ou perder velocidade.
Jp