2008-11-14 15 views
39

Tengo una tabla mysql donde una columna INT indexada va a ser 0 para el 90% de las filas. Si cambio esas filas para usar NULL en lugar de 0, ¿quedarán fuera del índice, haciendo que el índice sea un 90% más pequeño?¿El índice de mysql tiene valores nulos?

+0

Excelente pregunta –

Respuesta

5

Parece que indexa el NULL s también.

Tenga cuidado al ejecutar esto porque MySQL bloqueará la tabla para escrituras durante la creación del índice. La construcción del índice puede tomar un tiempo en tablas grandes, incluso si la columna está vacía (todos los valores nulos).

Reference.

+2

¿Cómo llegaste a esa conclusión? No veo ninguna mención del tema. –

+0

Fue en los comentarios en la parte inferior del artículo. Saqué la parte relevante. –

+5

Creo que la razón por la que se tarda un tiempo en tablas grandes es porque MySQL tiene que leer toda la tabla, no porque está construyendo un índice gigante. Podría estar equivocado. –

1

No, continuará incluyéndolos, pero no haga demasiadas suposiciones sobre cuáles son las consecuencias en ambos casos. Mucho depende del rango de otros valores (google para "cardinalidad").

MSSQL tiene un nuevo tipo de índice llamado "índice filtrado" para este tipo de situación (es decir, incluye registros en el índice basado en un filtro). Los sistemas de tipo dBASE solían tener una capacidad similar, y era bastante útil.

2

Permitir que una columna sea nula agregará un byte a los requisitos de almacenamiento de la columna. Esto conducirá a un aumento en el tamaño del índice que probablemente no sea bueno. Dicho esto, si cambian muchas de sus consultas para usar "IS NULL" o "NOT NULL", en general podrían ser más rápidas que las comparaciones de valores.

Mi instinto me dice que no es nulo, pero hay una respuesta: ¡prueba!

+3

-1 Esto no responde la pregunta. – user359996

+1

La pregunta era si el índice aumentaría de tamaño. La respuesta fue que aumentaría el tamaño del índice en la segunda oración. –

+3

El * título * pregunta si MySQL indexa las columnas nulas (sí lo hace). La * descripción * parece hacer una pregunta algo diferente, pero en realidad es solo una elucidación de por qué se hizo la pregunta (título), en primer lugar. Además, dado que las personas en gran medida eligen si leer o no una pregunta basada en su título, diría que el formulario del título reemplaza el formulario de descripción, en la mayoría de los casos. – user359996

13

http://dev.mysql.com/doc/refman/5.0/en/is-null-optimization.html

MySQL puede realizar la misma optimización de col_name IS NULL que se puede utilizar para col_name = constant_value. Por ejemplo, MySQL puede usar índices y rangos para buscar NULL con IS NULL

+0

Tenga en cuenta que la documentación menciona algunas advertencias, p. "la optimización solo puede manejar un IS NULL". – Timo

0

Cada índice tiene una cardinalidad que significa cuántos valores distintos están indexados. AFAIK no es una idea razonable decir que los índices repiten el mismo valor para muchas filas, pero el índice solo aborda un valor repetido para el índice agrupado de muchas filas (filas que tienen valor nulo para este campo) y conserva el ID de referencia del índice agrupado significa que cada fila con un campo indexado de valor NULL pierde un tamaño tan grande como el PK (por esta razón, los expertos recomiendan tener un tamaño de PK razonable si tiene PK compuesto).