valor tipos tipo poner insertar definir datos como campo booleano sql mysql database indexing

sql - tipos - Campos booleanos de indexación



insertar datos tipo bit en sql (6)

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

Dada una situación común, como registros 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?


¿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 registro con el mismo nombre varias veces (si usa un índice único en las columnas deleted_at AND name)
  2. Puede buscar registros 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 base de datos proporciona las respuestas finales en una base de datos 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 sería útil si estuvieras usando una vista (donde se eliminó = 0) y consultas regularmente desde esta vista.


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

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 menos tener cardinalidad de 3 para que la indexación funcione en ese campo, pero confirme esto.


No.

Usted indexa los campos que se buscan y tienen 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).

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


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