Agradezco el significado semántico de un valor NULL en una tabla de base de datos, diferentes tanto falsa y la cadena vacía «. Sin embargo, a menudo he leído acerca de los problemas de rendimiento cuando los campos se admitan y se recomienda utilizar una cadena vacía en los casos donde NULO en realidad es semánticamente correcto.

Qué circunstancias son apropiadas para el uso que aceptan valores null campos y valores NULL? ¿Cuáles son los trade-offs? Es razonable, simplemente, evitar el uso de valores Nulos en total, y sólo tiene que utilizar las cadenas vacías, falsas o 0 para indicar la ausencia de un valor?

ACTUALIZACIÓN

OK – entiendo que la diferencia semántica entre » y NULOS, así como el rendimiento (agnóstico) circunstancias en las que es NULO el campo correspondiente valor. Sin embargo, permítanme ampliar la alusión problema de rendimiento. Esto es de la excelente «de Alto Rendimiento de MySQL» por Schwartz, Zeitsev et al
http://www.borders.co.uk/book/high-performance-mysql-optimization-backups-replication-and-more/857673/:

Es más difícil para MySQL para optimizar
las consultas que se refieren a valores null coumns,
porque hacen que los índices, el índice de
las estadísticas, y el valor de las comparaciones más
complicado. Una columna que acepta valores null se utiliza
más espacio de almacenamiento y requiere
procesamiento especial dentro de MySQL. Cuando
una columna que acepta valores null es indexado, se
requiere un byte extra por entrada y
puede incluso causar un tamaño fijo en efecto
(como un índice en una sola entero
columna) se convierten en un
la variable de tamaño de uno en MyISAM.

Más aquí:
Búsqueda de libros de Google vista previa

Esta es, posiblemente, la respuesta definitiva – yo estaba buscando una segunda opinión y la experiencia de la línea de la frente.

11 Comentarios

  1. 37

    Sin embargo, a menudo he leído acerca de
    los problemas de rendimiento cuando los campos son
    acepta valores null y se recomienda el uso de un
    cadena vacía en los casos donde es NULL
    en realidad semánticamente correcta.

    Voy a ser nit-exigente acerca de la elección de la palabra por un momento:

    • Incluso si se tratara de un significativo factor de rendimiento, que no lo hace semánticamente correcto usar un valor en lugar de NULL. En SQL, NULL tiene una semántica papel, para denotar una falta o inaplicable valor. Las características de rendimiento de NULL en un RDBMS la aplicación son independientes de este. El rendimiento puede variar de una marca a otra o de una versión a otra, pero el propósito de NULL en el lenguaje es coherente.

    En cualquier caso, no he escuchado de ninguna evidencia de que los NULOS realiza mal. Yo estaría interesado en las referencias a las medidas de rendimiento que muestran columnas que aceptan valores null rinden peor que los que no aceptan valores null columnas.

    Yo no estoy diciendo que no estoy equivocado o que no puede ser cierto en algunos casos, sino sólo que no es significativo para hacer supuestos de inactividad. La ciencia no se compone de conjetura; uno tiene que mostrar evidencia con medidas repetitivas.

    Métricas también digo por cuánto el rendimiento es diferente, así que usted puede hacer un juicio acerca de si es algo que vale la pena preocuparse. Es decir, el impacto podría ser medibles y distinto de cero, pero todavía insignificante comparado con el mayor de los factores de desempeño, tales como la indexación de las tablas o cambiar el tamaño de la caché de base de datos.

    En MySQL, busca NULL puede beneficiarse de un índice:

    mysql> CREATE TABLE foo (
      i INT NOT NULL,
      j INT DEFAULT NULL,
      PRIMARY KEY (i),
      UNIQUE KEY j_index (j)
    );
    
    mysql> INSERT INTO foo (i, j) VALUES 
      (1, 1), (2, 2), (3, NULL), (4, NULL), (5, 5);
    
    mysql> EXPLAIN SELECT * FROM foo WHERE i = 3;
    +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
    | id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra |
    +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
    |  1 | SIMPLE      | foo   | const | PRIMARY       | PRIMARY | 4       | const |    1 |       | 
    +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
    
    mysql> EXPLAIN SELECT * FROM foo WHERE j IS NULL;
    +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
    | id | select_type | table | type | possible_keys | key     | key_len | ref   | rows | Extra       |
    +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
    |  1 | SIMPLE      | foo   | ref  | j_index       | j_index | 5       | const |    2 | Using where | 
    +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+

    Nota que todavía no es una medida de rendimiento. Sólo he demostrado que se puede utilizar un índice, mientras que la búsqueda de NULL. Voy a afirmar (aunque sin haber medido, pero bueno esto es solo StackOverflow) que el beneficio de un índice eclipsa cualquier posible sanción al buscar NULL frente a una cadena en blanco.

    No es una correcta decisión de diseño para elegir el cero o en blanco o cualquier otro valor para sustituir el valor NULL. Puede que necesite utilizar los valores como significativos en la columna. Por eso NULL existe, como un valor que es, por definición, fuera del dominio de valores de cualquier tipo de datos, así que usted puede utilizar el rango completo de valores de números enteros o cadenas de caracteres o lo que sea y aún tiene algo para indicar «ninguno de los valores anteriores.»

    • mysql 5.6.34-log dentro de AWS o a instancia de RDS es horrible. Por defecto sql_mode es horrible y establecer a NO_ENGINE_SUBSTITUTION, que le permite insertar NULLS en un NOT NULL Columna. y el rendimiento es horrible, como que no hay advertencias o estricta en espera de forma exponencial ya se va a convertir el NULLS EN ''! muy muy mal comportamiento! por favor, compruebe siempre lo que sus tablas y permitir una más estricta SQL_MODE Incluso si es sólo en su SESSION
  2. 11

    El manual de MySQL en realidad tiene un buen artículo sobre los problemas con NULL.

    Espero que ayude.

    También encontré este otro ASÍ que el post acerca de NULL y el Rendimiento

    • Si estoy leyendo ese derecho, que no hay ningún problema NULL (rendimiento o de otra manera), sino más bien con la escasa comprensión de NULL comportamiento, sí?
    • Estás leyendo bien, y Karwin siempre está en lo correcto acerca de la base de datos de preguntas. (Además, estoy de acuerdo con todo lo que él dice). Preste especial atención a la palabra «micro-optimización», especialmente cerca de la palabra «evitar».
  3. 5

    Que no permiten valores NULL en nuestras bases de datos a menos que sea para valores numéricos, o por fechas. La razón por la que hacemos esto es porque los valores numéricos, a veces, no debe estar en mora a cero ya que esto es muy, muy malo. Soy un desarrollador de corredores de bolsa y hay una gran, gran diferencia entre NULL y 0. El uso de UNEN es muy útil si queremos a los valores predeterminados de vuelta a cero, aunque no almacenamos como tales.

    MyVal = COALESCE(TheData, 0)

    Como hacemos inserciones masivas de datos de archivos planos utilizamos el formato de archivos para determinar la entrada de los datos que automáticamente convierte los valores vacíos en blanco cadenas de todos modos.

    Fechas predeterminado para cualquier valor puede aparecer depende de la intercalación creo, pero la nuestra por defecto a algo como 1900, y de nuevo, las fechas son muy importantes. Otro texto sin valores no son tan importantes, y si se deja en blanco normalmente califican como bueno.

    • Los valores predeterminados que se obtenga un conjunto son sus table_structure no permite valores nulos, pero su SQL_MODE es más probable NO_ENGINE_SUBSTITUTION que automagically-convert sus valores NULOS para '' (en relación a MySQL)
  4. 3

    Por lo general, si un atributo es necesario, es definido como not NULL y si puede ser omitido se define como que aceptan valores null.

  5. 2

    Como @ForYourOwnGood dijo – Null debe ser utilizado para «desconocido» de la información. Por ejemplo: Si usted tiene un montón de campos que el cliente debe llenar el registro y algunos de ellos son opcionales. Por alguna razón, puede que desee reservar un ID para ese cliente en particular y dado que usted no sabe si los campos opcionales son una opción real por el cliente para ser dejado en blanco se debe establecer como NULL decir «desconocido» al guardar por primera vez la fila. Si el cliente envía el formulario, pasa todo su validación y, a continuación, guardar la información, entonces usted sabe que para el hecho de que la opcional de campo se deja vacío por la intención.

    Este es un buen caso de uso de NULL.

    • NULL tiene mucho sentido si se piensa en una tabla que tiene un campo de tipo DATETIME y este campo es llevar a cabo una actualización de tiempo. Cuando se insertan datos en la fila que usted no desea que este campo tiene valor, pero no puede agregar 0 bien. Así NULL hace perfecto sentido.
  6. 2

    La cadena vacía no debe ser utilizado en lugar de NULL. NULL no representa nada, donde la cadena vacía es algo, con nada dentro. NULL siempre será falsa cuando se compara con otro valor (incluso NULL) y NULL no se suman en el COUNT función.

    Si usted necesita para representar la información desconocida que no hay sustituto para NULL.

  7. 1

    El principal beneficio, por supuesto, es el significado semántico de NULL, que usted ha mencionado.

    Además de que-y esto puede depender de su motor de almacenamiento, como siempre, consulte la documentación — pero, al menos en algunas bases de datos, los valores Nulos ocupan mucho menos espacio que un valor. Por ejemplo, si usted tiene un «varchar» columna declarada a ser de 20 caracteres, y rara vez se llena, usted puede ahorrar un montón de espacio en el disco por lo que es NULO en lugar de una cadena vacía.

    Nunca he oído hablar de problemas de rendimiento con el uso de valores Nulos, uno de los de enfrente. He escuchado de personas que ensuciar su cuenta porque ellos contaban con valores Nulos mal, pero nunca de rendimiento. Si eso es una cosa real, me encantaría oír hablar de eso!

  8. 1

    El significado de una columna NULL es más o menos «no se aplican en este contexto». Yo generalmente uso NULL columnas en dos casos:

    • Si el campo no se aplica (digamos que usted tiene una columna booleana is_thirsty y agregar dos conjuntos de datos. Un hombre y una piedra. En el caso de los humanos, se establece is_thirsty ya sea verdadera o falsa, mientras que en el caso de la piedra, probablemente establece a NULL.
    • Si necesito algo bandera y almacenar datos con el valor. Como un inventario fecha de cierre, que tendría que utilizar para: a) especificar que el inventario no se puede cambiar más y b) para especificar cuando el inventario fue cerrado. En lugar de tener dos columnas (closed_at y is_closed), acabo de crear la closed_at columna y se establece a NULL si el inventario puede ser cambiada, pero el conjunto de la fecha en que una vez que se cierre.

    Básicamente todo se reduce al hecho de que yo uso NULL cuando el vacío de un campo tiene un único diferente semántica que un campo vacío. La ausencia de un medio inicial es sólo eso. La ausencia de una fecha de cierre tiene el significado de que el inventario conjunto de todavía estar abiertos a los cambios.

    Valores NULOS pueden tener efectos secundarios desagradables y le harán la vida más difícil para usted para agregar datos a la tabla y más a menudo que no, usted puede terminar para arriba con una mezcolanza de valores NULOS y cadenas vacías por ejemplo.

    También, NULL no es igual a nada, que el tornillo de consultas en todo el lugar, si no eres muy cuidadoso.

    Personalmente, yo uso NULL columnas sólo cuando uno de los dos casos anteriores, se aplica. Yo nunca lo uso para indicar los campos vacíos cuando el vacío no tiene otro significado que la ausencia de un valor.

    • El más simple pregunta es, «Si voy a añadir una nueva fila, necesito tener un valor para esta columna?». Si no, se aceptan valores null, y viendo NULL en la columna significa que no introduzca un valor (por cualquier razón).
  9. 1

    Entiendo que hay momentos en MySQL NULL semántica son totalmente apropiados.

    Que dijo, lo hacen en serio en el camino, especialmente con los campos de texto.

    He aquí un ejemplo del mundo real.

    Queremos copiar los datos desde una base de datos de FileMaker en una tabla mysql.

    si hacemos «SELECT * from tabla where campo de texto <> ‘prueba'», las filas que tienen textfield de NULL NO serán devueltos. Esto es más probable que no sea lo que usted esperaba o deseaba.

    si un campo acepta valores null se utiliza en un lugar de consulta, ya sea solo o como parte de una Y, las entradas que son NULOS NUNCA serán devueltos a menos que el ES NULA de la prueba utilizada. Debemos hacer algo como «where ((textfield<>»prueba») O (textfield NO ES NULL))», que es feo de lo mejor.

    Por lo que en este caso, probablemente no desea que el campo acepta valores null.

    El problema aquí es que NO se puede insertar una cadena vacía en MySQL utilizando Filemaker. Esto se convierte en un valor NULO, que los errores a cabo si la columna no nula! Si usted permite NULOS, entonces la transferencia de mysql funciona, pero luego no las consultas de no actuar de la manera que quieras!

    la workaroud es alterar la mesa dos veces, para convertir la existente nulos después de la importación a la cadena vacía, a continuación, modificar la tabla de vuelta otra vez de permitir valores null. youch!

    maldito filemaker.

  10. 0

    Cualquier auto-respeto de motor de base de datos en estos días debe ofrecer ninguna sanción para utilizar adecuadamente los valores Nulos, salvo que la consulta no está diseñado correctamente (que no suele ser un problema tendrás muy a menudo con respecto a los valores Nulos).

    Usted debe pagar primero la atención a la utilización de la base de datos (incluidos los Nulos) como la intención; luego preocuparse por el optimizatin consecuencias cuando y si se producen.

    El efecto acumulativo de mal Anulado los valores de la columna en SQL complejidad y precisión casi seguramente son mayores que los beneficios de engañar con la Madre de DBMS. Además, se hace un lío de su cabeza, así como la de alguien más tarde que trata de averiguar lo que estaba tratando de hacer.

  11. 0

    En algunas bases de datos como Oracle, puede ser somethinkg en MySQL es cierto:

    • Valores nulos no son indexados, entonces, si se buscan los valores nulos pueden ser un cuello de botella.
    • Los valores null finales en las filas de ahorrar espacio.

Dejar respuesta

Please enter your comment!
Please enter your name here