Индекс для поиска элемента в массиве JSON
У меня есть таблица, которая выглядит так:
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"}]');
Есть несколько других столбцов, которые не имеют отношения к этому вопросу. Есть причина хранить их как JSON.
То, что я пытаюсь сделать, это поиск трека, который имеет определенныйимя художника (точное совпадение).
Я использую этот запрос:
SELECT * FROM tracks
WHERE 'ARTIST NAME' IN
(SELECT value->>'name' FROM json_array_elements(artists))
например
SELECT * FROM tracks
WHERE 'The Dirty Heads' IN
(SELECT value->>'name' FROM json_array_elements(artists))
Однако, это делает полное сканирование таблицы, и это не очень быстро. Я пытался создать индекс GIN с помощью функцииnames_as_array(artists)
и использовал'ARTIST NAME' = ANY names_as_array(artists)
Однако индекс не используется, и запрос на самом деле значительно медленнее.