sql >> Base de Datos >  >> RDS >> Mysql

Cuándo usar NULL en tablas MySQL

Voy a ser quisquilloso con la elección de palabras por un momento:

  • Incluso si fuera un factor de rendimiento significativo, eso no lo hace semánticamente correcto usar un valor en lugar de NULL. En SQL, NULL tiene un rol semántico, para denotar un valor faltante o inaplicable. Las características de rendimiento de NULL en una implementación RDBMS dada son independientes de esto. 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 consistente.

En cualquier caso, no he oído hablar de ninguna evidencia de que NULL funcione mal. Me interesaría cualquier referencia a las medidas de rendimiento que muestren que las columnas que aceptan valores NULL funcionan peor que las columnas que no aceptan valores NULL.

No digo que no esté equivocado o que no pueda ser cierto en algunos casos, solo que no tiene sentido hacer suposiciones ociosas. La ciencia no se compone de conjeturas; uno tiene que mostrar evidencia con medidas repetibles.

Las métricas también te dicen por cuánto el rendimiento difiere, por lo que puede juzgar si es algo por lo que valga la pena preocuparse. Es decir, el impacto podría ser medible y distinto de cero, pero aun así insignificante en comparación con factores de rendimiento mayores, como la indexación adecuada de tablas o el tamaño de la memoria caché de la base de datos.

En MySQL, las búsquedas de NULL pueden 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 | 
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+

Tenga en cuenta que todavía no es una medida de rendimiento. Solo he mostrado que puedes usar un índice mientras buscas NULL. Voy a afirmar (ciertamente sin haber medido, pero bueno, esto es solo StackOverflow) que el beneficio de un índice eclipsa cualquier posible penalización al buscar NULL en lugar de una cadena en blanco.

No es una decisión de diseño correcta elegir cero o en blanco o cualquier otro valor para sustituir NULL. Es posible que deba usar esos valores como significativos en la columna. Es por eso que NULL existe, como un valor que, por definición, está fuera del dominio de los valores de cualquier tipo de datos, por lo que puede usar el rango completo de valores de enteros o cadenas o lo que sea y aún tener algo para significar "ninguno de los valores anteriores. "