Индекс PostgreSQL для поиска jsonb @>

У меня есть следующий запрос:

 SELECT "survey_results".* FROM "survey_results" WHERE (raw @> '{"client":{"token":"test_token"}}');

EXPLAIN ANALYZE возвращает следующие результаты:

 Seq Scan on survey_results  (cost=0.00..352.68 rows=2 width=2039) (actual time=132.942..132.943 rows=1 loops=1)
   Filter: (raw @> '{"client": {"token": "test_token"}}'::jsonb)
   Rows Removed by Filter: 2133
 Planning time: 0.157 ms
 Execution time: 132.991 ms
(5 rows)

Я хочу добавить индекс на client ключ внутри raw поле, поэтому поиск будет быстрее. Я не знаю, как это сделать. Когда я добавляю индекс для всего raw столбец как это:

CREATE INDEX test_index on survey_results USING GIN (raw);

тогда все работает как положено. Я не хочу добавлять индекс для всего raw потому что у меня много записей в базе данных, и я не хочу увеличивать ее размер.

1 ответ

Если вы используете объекты JSON в качестве atm в примере, вы можете указать только индекс client как это:

CREATE INDEX test_client_index ON survey_results USING GIN (( raw->'client ));

Но так как вы используете @> оператор в вашем запросе, то в вашем случае может иметь смысл создать индекс только для этого оператора, как этот:

CREATE INDEX test_client_index ON survey_results USING GIN (raw jsonb_path_ops);

Смотрите больше из документации по индексации Postgres JSONB:

Другие вопросы по тегам