Индекс для поиска элемента в массиве 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)Однако индекс не используется, и запрос на самом деле значительно медленнее.

Ответы на вопрос(1)

Ваш ответ на вопрос