2009-12-04 35 views
63

Esta es probablemente una pregunta realmente estúpida, pero ¿va a ser muy beneficioso indexar un campo booleano en una tabla de base de datos?Campos booleanos de indexación

Dada una situación común, como los registros de "eliminación suave" que se marcan como inactivos, y por lo tanto la mayoría de las consultas incluyen WHERE deleted = 0, ¿le ayudaría a indexar ese campo por sí mismo, o debería combinarse con el otro comúnmente? -search campos en un índice diferente?

+0

Posible duplicado de [¿Hay algún aumento de rendimiento en la indexación de un campo booleano?] (Http://stackoverflow.com/questions/10524651/is-here-any-performance-gain-in-indexing-a-boolean- campo) –

+3

@AmirAliAkbari: ¡Oh! ¡No! Una referencia circular! Ojalá S.O. no explotará! – Paul

Respuesta

51

campos de índice que se buscan en y tienen una alta selectividad/cardinalidad. La cardinalidad de un campo booleano se borra en casi cualquier tabla. En todo caso, hará que sus escritos sean más lentos (en una cantidad muy pequeña).

¿Quizás sería el primer campo en el índice agrupado si cada consulta tuviera en cuenta las eliminaciones programadas?

+2

imagina un gran libro con miles de páginas. Las páginas contienen una sola letra, 'A' o 'B' y un número aleatorio. ¿Te beneficiaría encontrar una determinada entrada de números aleatorios para la que sabes que está en una de las páginas 'A' cuando las páginas A y B no están mezcladas, pero el libro comienza con páginas A solamente y luego B? Sí lo haría ... así que supongo que está equivocado .. – tObi

6

Creo que ayudaría, especialmente en los índices de cobertura.

Cuánto/poco depende, por supuesto, de sus datos y consultas.

Puede tener teorías de todo tipo acerca de los índices, pero las respuestas finales las proporciona el motor de la base de datos en una base de datos con datos reales. Y a menudo te sorprende la respuesta (o tal vez mis teorías son muy malas;)

Examina el plan de consultas de tus consultas y determina si las consultas se pueden mejorar o si los índices se pueden mejorar. Es bastante simple alterar los índices y ver qué diferencia hace

+3

+1: No veo el daño en la indexación de la columna –

+2

@OMGPonies El daño está en la sobrecarga de escritura adicional, en una mesa ocupada con muchas filas , esto realmente puede reducir el rendimiento de la consulta. Es solo un beneficio cuando hay una gran cardinalidad y las consultas se crean para aprovecharlas. – oucil

1

Creo que ayudaría si estuviera usando una vista (donde se eliminó = 0) y está consultando regularmente desde esta vista.

2

Creo que si su campo booleano es tal que usted se estaría refiriendo a ellos en muchos casos, tendría sentido tener una tabla separada, por ejemplo DeletedPages o SpecialPages, que tendrá muchos campos de tipo booleano, como is_deleted, is_hidden, is_really_deleted, requires_higher_user etc., y luego tomarías uniones para obtenerlos.

Por lo general, el tamaño de esta tabla sería más pequeño y obtendría alguna ventaja al tomar uniones, especialmente en lo que se refiere a la legibilidad y mantenimiento del código. Y para este tipo de consulta:

select all pages where is_deleted = 1

que sería más rápido para que se implementa de la siguiente:

select all pages where pages 
inner join DeletedPages on page.id=deleted_pages.page_id 

Creo que he leído en alguna parte sobre bases de datos mysql que necesita un campo a por lo al menos tenga cardinalidad de 3 para que la indexación funcione en ese campo, pero confirme esto.

+1

Es difícil de decir, dado que un booleano es muy fino y no tenemos ningún dato, pero al realizar una combinación y su flujo de trabajo, cada consulta haría las consultas más lentas, no más rápidas, especialmente si las claves principales se agrupaban de forma diferente y si La tabla deleted_pages fue necesaria para cada consulta. –

16

¿Qué es una columna deleted_at DATETIME? Hay dos beneficios.

  1. Si necesita una columna única como nombre, puede crear y suaves al eliminar un registro con el mismo nombre varias veces (si se utiliza un índice único en las columnas deleted_at y nombre)
  2. Puede buscar para registros eliminados recientemente

Usted consulta podría tener este aspecto:

SELECT * FROM xyz WHERE deleted_at IS NULL 
0

Si está utilizando la base de datos que soporta índices de mapa de bits (como Oracle), entonces este índice en una columna booleana mucho más útil que sin él.