Estou lutando para otimizar a criação correta do índice para minha estrutura de dados. Estou tentando indexar uma grande quantidade de dados (~ 100B registros) do tipo de dados json:
{
"email": "[email protected]",
"first_domain": "q.w.e.r.t.y.com"
"second_domain": "a.s.d.f.g.h.j.com"
}
Uma consulta simples pode parecer
SELECT *
from table
WHERE email = '[email protected]'
OU
SELECT *
from table
WHERE first_domain LIKE '%.r.t.y.com'
OR second_domain LIKE '%.r.t.y.com'
Anteriormente, eu tokenizaria todos os domínios e os colocaria juntos em uma matriz no mongo
{
"values": ["[email protected]", "moc.y.t.r.e.w.q", moc.j.h.g.f.d.s.a]
}
Mas, tendo uma quantidade de dados, o Mongo não pode armazenar todos os valores na memória e o desempenho de gravação diminui.
Então, estou planejando tentar o índice Postgres e GIN. Por favor, sugira-me uma criação de índice adequada para tal situação.
A primeira consulta seria escrita corretamente assim:
Isso pode ser suportado com um índice B-Tree:
Como a condição LIKE usa o caractere curinga no lado esquerdo, você precisará de um índice de trigrama (após instalar a
pg_trgm
extensão)Novamente, você precisa usar a sintaxe correta para extrair os valores da coluna JSON: