Индекс 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: