NULL o NOT NULL por defecto?


41

En MySQL, ¿es mejor permitir siempre nulos a menos que sepa que se requiere un campo, o usar siempre a Not Nullmenos que sepa que un campo contendrá nulos? ¿O no importa?

Sé que en algunos DBMS dicen que se use Not Nulltanto como sea posible porque permitir nulos requiere un bit adicional (¿o byte?) Por registro para almacenar el estado Nulo.


1
Debe permitir NULLsi y solo si el NULLvalor tiene una interpretación para lo que está modelando.
jameshfisher

Respuestas:


25

En la mayoría de las bases de datos, una NOT NULLcolumna será más eficiente en términos de datos almacenados por el motivo que establezca, y también más eficiente para consultar e indexar, por lo que, a menos que desee permitir NULL en una columna, debe rechazarlos explícitamente.

Habrá una ligera implicación en el rendimiento, ya que las NOT NULLrestricciones adicionales tendrán que verificarse potencialmente para cada fila que afecte con cualquier INSERTAR o ACTUALIZAR, pero como la mayoría de las bases de datos son relativamente leves para escribir y leer, esto probablemente no sea una preocupación (lo poco De todos modos, es poco probable que el tiempo adicional sea notable, ya que es una operación vinculada a la CPU donde el resto de la operación de inserción / actualización estará vinculada a las E / S y, por lo tanto, un cuello de botella mucho más significativo) y le brinda algo de "libre "comprobación de datos para que su código (o el código de otras personas) no pueda colocar NULL accidentalmente donde otro código no los espera y, por lo tanto, puede dar resultados incorrectos en su presencia.

Editar: Como Peter señala en su comentario, lo anterior es un generalismo y puede no ser cierto para todos los DMBS, aunque estoy bastante seguro de que lo es para mysql y mssql. Otras complicaciones en el área pueden incluir características como tablas dispersas (como MSSQL 2008 implementado, por ejemplo) que alterarán la dinámica de rendimiento de las columnas (no) anulables.


8
Esto no es necesariamente cierto en PostgreSQL. Las columnas nulas ahorran espacio, lo que puede mejorar la velocidad, y el tiempo de procesamiento debería ser aproximadamente el mismo.
Peter Eisentraut

44
Esto tampoco es cierto para Oracle. Además, a diferencia de MySql, Oracle no indexa nulos, por lo que puede reducir el tamaño de sus índices al usarlos. Ver stackoverflow.com/questions/289001/does-mysql-index-null-values
Leigh Riffel

8

Debe dejar que el diseño de su esquema y los requisitos de la aplicación guíen esta decisión. Las diferencias de rendimiento probablemente no se noten de ninguna manera en la mayoría de los casos.


3
Una vez más, la mejor manera de saberlo con certeza es con perfiles y pruebas.
jcolebrand

Sería cuidadoso con declaraciones tan amplias: si escribe 10 millones de filas por noche en una tabla a través de algún proceso ETL y esa tabla tiene un montón de campos restringidos No nulos, verá los impactos en el rendimiento.
ScottCher

1
+1: Tal vez no sea cierto para todas las aplicaciones, pero para lo que estoy haciendo, obtener datos consistentes / correctos es más importante que ahorrar algo de espacio o perder algo de velocidad.
jp
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.