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

NULL en MySQL (rendimiento y almacenamiento)

Depende del motor de almacenamiento que utilice.

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. Consulte https://dev.mysql.com/doc/internals/ es/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 desplazamiento de inicio de campo está activado si la columna es NULL. En ese caso, la columna no necesita ser almacenada en absoluto. Entonces, si tiene muchos NULL, su almacenamiento debería reducirse significativamente. Consulte 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 NULL mejorando el rendimiento es que en InnoDB, una página de datos puede caber en 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 está en el ámbito de la microoptimización. Debe centrar su atención en otra parte, en áreas que le den más valor a su inversión. Por ejemplo, agregar índices bien elegidos o aumentar la asignación de caché de la base de datos.