2012-09-22 22 views
22

Tengo un modelo de Rails con un campo booleano que busco (utilizo un alcance que encuentra todas las instancias donde el campo se establece en verdadero). Estoy usando Postgres.Agregar un índice en un campo booleano

Mi instinto es agregar un índice en el campo booleano. ¿Es esa una buena práctica, o hay algo en Postgres que hace innecesario un índice en un campo booleano?

Respuesta

34

No, puede indexar un campo booleano si va a filtrar por él. Eso es algo perfectamente razonable, aunque como con todos los índices, PostgreSQL puede optar por ignorarlo si no excluye suficiente de la tabla: un escaneo de índice más una tonelada de escaneos de fila puede ser más costoso que un escaneo secuencial - - que puede afectarle o no según los valores de esa columna.

También debe tener en cuenta que PostgreSQL le permite poner condiciones en los índices, que a menudo encuentro útiles con los campos booleanos. (Consulte Partial Indexes para obtener más detalles.) Si normalmente filtrará o clasificará dentro de ese alcance, es posible que lo atienda mejor algo como CREATE INDEX ... ON table (some_field) WHERE boolean_field.

+21

Solo para agregar a esto, si su campo booleano tiene 99.9% de un valor en él, puede ser muy útil solo indexar los otros valores posibles. Es decir. 99.9% falso, 0% nulos, 0.1% verdadero, luego crea índice ... en la tabla (boolval) donde boolval es verdadero; indexará solo los valores verdaderos. –

+6

+1 por mencionar índices parciales. –

13

Para crear el índice parcial en una migración de Rails, haría esto. En este ejemplo, el modelo es Product y la columna es featured.

class AddFeaturedOnProducts < ActiveRecord::Migration 
    def change 
    add_index(:products, :featured, where: "featured") 
    end 
end 
Cuestiones relacionadas