Campos booleans de indexing

Esta es probablemente una pregunta realmente estúpida, pero ¿va a haber mucho beneficio al indexar un campo boolean en una tabla de database?

Dada una situación común, como loggings de "eliminación suave" que están marcados como inactivos, y por lo tanto, la mayoría de las consultas incluyen WHERE deleted = 0 , ¿le ayudaría tener ese campo indexado por sí mismo, o debería combinarse con el otro comúnmente? buscado campos en un índice diferente?

No.

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

¿Tal vez lo haría el primer campo en el índice agrupado si cada consulta tuviera en count las eliminaciones progtwigdas?

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

  1. Si necesita una columna única como nombre, puede crear y borrar en forma suave un logging con el mismo nombre varias veces (si usa un índice único en las columnas deleted_at AND name)
  2. Puede search loggings eliminados recientemente.

Tu consulta podría verse así:

 SELECT * FROM xyz WHERE deleted_at IS NULL 

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 sobre los índices, pero el motor de la database proporciona las respuestas finales en una database con datos reales. Y a menudo te sorprende la respuesta (o tal vez mis teorías son muy malas;)

Examine el plan de consulta de sus consultas y determine si las consultas se pueden mejorar o si los índices se pueden mejorar. Es bastante simple alterar los índices y ver qué diferencia hace

Creo que si su campo boolean es tal que 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 boolean, como is_deleted , is_hidden , is_really_deleted , requires_higher_user , etc., y luego tomarías uniones para getlos.

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

Sería más rápido tenerlo implementado así:

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

Creo que lo leí en alguna parte sobre las bases de datos mysql que necesita un campo para al less tener cardinalidad de 3 para que la indexing funcione en ese campo, pero confirme esto.

Creo que sería útil si estuvieras usando una vista (donde se eliminó = 0) y consultas regularmente desde esta vista.

Si está utilizando una database que admite índices de bitmap (como Oracle), dicho índice en una columna booleana será mucho más útil que sin él.