Índice para localizar um elemento em uma matriz JSON
Eu tenho uma tabela que se parece com isso:
CREATE TABLE tracks (id SERIAL, artists JSON);
INSERT INTO tracks (id, artists)
VALUES (1, '[{"name": "blink-182"}]');
INSERT INTO tracks (id, artists)
VALUES (2, '[{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]');
Existem várias outras colunas que não são relevantes para esta pergunta. Há uma razão para armazená-los como JSON.
O que estou tentando fazer é procurar uma faixa que tenha umnome do artista (Combinação exata).
Estou usando esta consulta:
SELECT * FROM tracks
WHERE 'ARTIST NAME' IN
(SELECT value->>'name' FROM json_array_elements(artists))
por exemplo
SELECT * FROM tracks
WHERE 'The Dirty Heads' IN
(SELECT value->>'name' FROM json_array_elements(artists))
No entanto, isso faz uma verificação completa da tabela e não é muito rápido. Eu tentei criar um índice GIN usando uma funçãonames_as_array(artists)
e usado'ARTIST NAME' = ANY names_as_array(artists)
, no entanto, o índice não é usado e a consulta é realmente significativamente mais lenta.