Indexação Rails Avançada: cláusula WHERE (postgresql)

Não sei muito sobre bancos de dados, especialmente em comparação com meus colegas. O que sei, aprendi lendo as experiências de outras pessoas logo depois de ter encontrado um problema. Desta vez, eu estava tendo problemas de desempenho de tempo de pesquisa. Considere esta consulta Rails ActiveRecord:

Status.bad.pluck(:text)

Isso produz esta instrução SQL:

SELECT "statuses"."text" FROM "statuses" WHERE "statuses"."liked" = 'f'

Esta consulta, em meu banco de dados de desenvolvimento, demorou 107.6ms. Tenho que fazer essa operação cerca de 100.000 vezes! Eu sabia que poderia melhorar o desempenho com índices, mas não sabia bem como. Minha solução geral para indexação tem sido adicionar um a qualquer campo que seja: uma string curta, um campo booleano, um inteiro ou um float. Eu sei que isso não é o melhor, mas é melhor do que nenhum índice. Me deparei com este artigo de Heroku .

Minha próxima etapa foi procurar como fazer cláusulas where nos índices nas migrações, mas não encontrei nada . Isso provavelmente se deve ao fato de a cláusula where ser específica do postgresql. Então eu fui em frente e usei o execute. Para minha surpresa, db/schema.rbtive meu índice e usei uma where:opção! Isso significava que o ActiveRecord o suportava e eu poderia usá-lo livremente, então gerei este índice:

class AddDislikedIndexToStatuses < ActiveRecord::Migration
def change
add_index
:statuses, :liked, name: "index_statuses_on_disliked", where: "(liked IS FALSE)"
end
end

E agora a consulta começou 48.6ms!