multiple - NULL en MySQL(rendimiento y almacenamiento)
mysql update (5)
¿Qué es exactamente lo que hace null rendimiento y almacenamiento (espacio) sabio en MySQL?
Por ejemplo:
TINYINT: 1 byte TINYINT w / NULL 1 byte + de alguna manera almacena NULL?
Depende de qué motor de almacenamiento use.
En formato MyISAM, cada encabezado de fila contiene un campo de bits con un bit para cada columna para codificar el estado NULL. Una columna que es NULL aún ocupa espacio, por lo que NULL no reduce el almacenamiento. Ver https://dev.mysql.com/doc/internals/en/myisam-introduction.html
En InnoDB, cada columna tiene un "desplazamiento de inicio de campo" en el encabezado de la fila, que es de uno o dos bytes por columna. El bit alto en esa compensación de inicio de campo está activado si la columna es NULA. En ese caso, la columna no necesita ser almacenada en absoluto. Entonces, si tiene muchos NULL, su almacenamiento debería reducirse significativamente. Ver https://dev.mysql.com/doc/internals/en/innodb-field-contents.html
EDITAR:
Los bits NULL son parte de los encabezados de fila, no elige agregarlos.
La única forma en que puedo imaginar que NULL mejore el rendimiento es que en InnoDB, una página de datos puede ajustarse a más filas si las filas contienen valores NULL. Entonces, sus búferes InnoDB pueden ser más efectivos.
Pero me sorprendería mucho si esto proporciona una importante ventaja de rendimiento en la práctica. Preocuparse por el efecto que tienen los NULL en el rendimiento se encuentra en el ámbito de la micro-optimización. Debes enfocar tu atención hacia otro lado, en las áreas que dan mayor importancia al dinero. Por ejemplo, agregar índices bien elegidos o aumentar la asignación de la memoria caché de la base de datos.
Eche un vistazo a mi publicación en este tema (en resumen, la respuesta es evitar NULO si es posible)
Estoy de acuerdo con Bill Karwin, aunque agregaría estas sugerencias de MySQL . El número 11 aborda esto específicamente:
Antes que nada, pregúntese si existe alguna diferencia entre tener un valor de cadena vacío vs. un valor NULL (para los campos INT: 0 frente a NULL). Si no hay ninguna razón para tener ambos, no necesita un campo NULO. (¿Sabía que Oracle considera que NULL y cadena vacía son lo mismo?)
Las columnas NULL requieren espacio adicional y pueden agregar complejidad a sus declaraciones de comparación. Solo evítales cuando puedas. Sin embargo, entiendo que algunas personas pueden tener razones muy específicas para tener valores NULL, lo que no siempre es malo.
Por otro lado, todavía utilizo null en tablas que no tienen toneladas de filas, sobre todo porque me gusta la lógica de decir NOT NULL.
Actualizar Revisando esto más tarde, agregaría que personalmente no me gusta usar 0 en lugar de NULL en la base de datos, y no lo recomiendo. Esto puede conducir fácilmente a muchos falsos positivos en su aplicación si no tiene cuidado.
La respuesta de Bill es buena, pero un poco desactualizada. El uso de uno o dos bytes para almacenar NULL se aplica solo al formato de fila REDUNDANTE de InnoDB. Dado que MySQL 5.0.3 InnoDB usa formato de fila COMPACTA que usa solo un bit para almacenar un NULL (por supuesto, un byte es el mínimo), por lo tanto:
Espacio requerido para NULLs = CEILING (N / 8) bytes donde N es el número de columnas NULL en una fila.
- 0 NULLS = 0 bytes
- 1 - 8 NULLS = 1 byte
- 9 - 16 NULLS = 2 bytes
- 17 - 24 NULLS = 3 bytes
- etc ...
De acuerdo con el sitio oficial de MySQL sobre COMPACT vs REDUNDANT:
El formato de fila compacta disminuye el espacio de almacenamiento de la fila en aproximadamente un 20% a costa de aumentar el uso de la CPU para algunas operaciones. Si su carga de trabajo es típica y está limitada por las tasas de aciertos de caché y la velocidad del disco, es probable que el formato compacto sea más rápido.
Ventaja de usar NULLS sobre cadenas vacías o ceros:
- 1 NULL requiere 1 byte
- 1 Empty String requiere 1 byte (suponiendo que VARCHAR)
- 1 cero requiere 4 bytes (asumiendo INT)
Empiezas a ver los ahorros aquí:
- 8 NULL requieren 1 byte
- 8 Cadenas vacías requieren 8 bytes
- 8 ceros requieren 32 bytes
Por otro lado, sugiero usar NULLs sobre cadenas vacías o ceros, porque son más organizados, portátiles y requieren menos espacio. Para mejorar el rendimiento y ahorrar espacio, concéntrese en utilizar los tipos de datos, índices y consultas adecuados en lugar de trucos extraños.
Más sobre: https://dev.mysql.com/doc/refman/5.7/en/innodb-physical-record.html
dev.mysql.com/doc/refman/5.0/en/is-null-optimization.html
MySQL puede realizar la misma optimización en col_name IS NULL que puede usar para col_name = constant_value. Por ejemplo, MySQL puede usar índices y rangos para buscar NULL con IS NULL