Pregunta

¿Qué hace exactamente nulo el rendimiento y el almacenamiento (espacio) en MySQL?

Por ejemplo:

TINYINT: 1 byte TINYINT w / NULL 1 byte + de alguna manera almacena NULL?

¿Fue útil?

Solución

Depende del motor de almacenamiento que uses.

En el formato MyISAM, cada encabezado de fila contiene un campo de bits con un bit para que cada columna codifique el estado NULL. Una columna que es NULL todavía ocupa espacio, por lo que los NULL no reducen el almacenamiento. Consulte 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 uno o dos bytes por columna. El bit alto en ese campo de desplazamiento de inicio está activado si la columna es NULL. En ese caso, la columna no necesita ser almacenada en absoluto. Por lo tanto, si tiene muchos NULL, su almacenamiento debe reducirse significativamente. Consulte https://dev.mysql.com/doc/internals/ es / innodb-field-contents.html

EDIT:

Los bits NULOS forman parte de los encabezados de las filas, no eliges agregarlos.

La única forma en que puedo imaginar que los NULL mejoren el rendimiento es que en InnoDB, una página de datos puede contener más filas si las filas contienen NULL. Por lo tanto, sus búferes de InnoDB pueden ser más efectivos.

Pero me sorprendería mucho si esto proporciona una ventaja de rendimiento significativa en la práctica. Preocuparse por el efecto que tienen los NULL en el rendimiento es en el ámbito de la microoptimización. Debes centrar tu atención en otra parte, en áreas que ofrezcan una mayor inversión. Por ejemplo, agregar índices bien elegidos o aumentar la asignación de caché de la base de datos.

Otros consejos

La respuesta de Bill es buena, pero un poco anticuada. El uso de uno o dos bytes para almacenar NULL se aplica solo al formato de fila InnoDB REDUNDANT. Como MySQL 5.0.3 InnoDB usa el formato de fila COMPACTO que usa solo un bit para almacenar un NULO (por supuesto, un byte es el mínimo), por lo tanto:

Espacio requerido para NULL = 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 ...

Según el sitio oficial de MySQL sobre COMPACT vs REDUNDANT:

  

El formato de fila compacto reduce el espacio de almacenamiento de fila en aproximadamente un 20% a costa de aumentar el uso de la CPU para algunas operaciones. Si su carga de trabajo es una típica que 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 Cadena vacía requiere 1 byte (asumiendo VARCHAR)
  • 1 cero requiere 4 bytes (asumiendo INT)

Comienzas 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 NULL 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 usar 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

Estaría de acuerdo con Bill Karwin, aunque agregaría estos consejos de MySQL . El número 11 aborda esto específicamente:

  

En primer lugar, pregúntese si hay alguna diferencia entre tener un valor de cadena vacío frente a un valor NULO (para campos INT: 0 frente a NULL). Si no hay razón para tener ambos, no necesita un campo NULO. (¿Sabía que Oracle considera que NULL y una cadena vacía son iguales?)

     

Las columnas NULL requieren espacio adicional y pueden agregar complejidad a sus declaraciones de comparación. Solo evítalos cuando puedas. Sin embargo, entiendo que algunas personas pueden tener razones muy específicas para tener valores NULL, lo que no siempre es algo malo.

Por otro lado, todavía utilizo null en tablas que no tienen toneladas de filas, principalmente 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 fácilmente conducir a muchos falsos positivos en su aplicación si no tiene cuidado.

dev.mysql.com/doc/refman/ 5.0 / es / 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top