2012-01-25 23 views
11

Tengo una columna que es un datetime, converted_at."is not null" vs boolean MySQL - Rendimiento

Planeo hacer llamadas que marquen WHERE converted_at is not null muy a menudo. Como tal, estoy considerando tener un campo booleano converted. ¿Es una diferencia de rendimiento significativa entre verificar si un campo es not null frente a si es false?

Gracias.

+1

No creo que haya una diferencia significativa en el rendimiento, pero si lo hay, es probable que esté a favor de 'no es nulo', ya que cuando se prueba boolean, aún así se desea saber si no es nulo. –

+0

@ MichaelKrelin-hacker: Supongo que el campo booleano se definiría como 'NOT NULL'. –

+0

@ypercube, no creo que se use como otra cosa que la restricción de integridad. –

Respuesta

5

Si las cosas son responsables en un solo campo, se prefiere dividir lo mismo en dos campos. Esto crea más infraestructura, que, en su caso es evitable.

En cuanto al núcleo de la pregunta, creo que la implementación de la base de datos, MySQL incluido, tendrá una bandera interna que es booleana de todos modos para representar la NULLabilidad de un campo.

Debe confiar en que esto se hace correctamente.

En cuanto al rendimiento, la pregunta más importante debe ser perfilar las consultas típicas que ejecuta en su base de datos y crear índices apropiados y analizar la tabla para mejorar los planes de ejecución y qué índices se utilizan durante las consultas. Esta pregunta tendrá un impacto mucho mayor en el rendimiento.

2

El uso de WHERE converted_at is not null o WHERE converted = FALSE probablemente será el mismo en materia de rendimiento de la consulta.

Pero si tiene este campo de bit adicional, que se usa para almacenar si el campo converted_at es nulo o no, tendrá que mantener la integridad de alguna manera (mediante triggers?) Cada vez que se agregue una nueva fila y cada vez que la columna se actualiza Entonces, esto es una des-normalización. Y también significa código más complicado. Además, tendrá al menos un índice más en la tabla (lo que significa operaciones de inserción/actualización/eliminación un poco más lentas).

Por lo tanto, no creo que sea bueno agregar este campo de bit.

Si puede cambiar la columna en cuestión de NULL a NOT NULL (posiblemente normalizando la tabla), puede obtener alguna ganancia de rendimiento (al costo/ganancia de tener más tablas).

Cuestiones relacionadas