Другите ви два индекса няма да работят просто защото ->>
операторът връща text
, докато очевидно имате jsonb
gin оператор класове в ума. Имайте предвид, че споменавате само json
, но всъщност се нуждаете от jsonb
за разширени възможности за индексиране.
За да изработите най-добрата стратегия за индексиране, ще трябва да дефинирате по-отблизо кои заявки да покриете. Интересувате ли се само от крави? Или всички животни / всички етикети? Кои оператори са възможни? Вашият JSON документ включва ли и неживотински ключове? Какво да правя с тези? Искате ли да включите редове в индекса, където кравите (или каквото и да е друго) изобщо не се показват в документа JSON?
Да приемем:
- Интересуваме се само от крави на първо ниво на гнездене.
- Стойността винаги е валидно
integer
. - Не се интересуваме от редове без крави.
Предлагам функционален btree индекс, подобно на това, което вече имате, но прехвърляне на стойността към integer
. Не предполагам, че бихте искали сравнението да се оценява като text
(където „2“ е по-голямо от „1111“).
CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int)); -- !
Допълнителният набор от скоби е необходим за преобразуването, за да направи синтаксиса на индексния израз недвусмислен.
Използвайте същия израз във вашите заявки, за да накарате Postgres да разбере, че индексът е приложим:
SELECT * FROM farm WHERE (animal ->> 'cow')::int > 3;
Ако имате нужда от по-общ jsonb
индекс, помислете за:
- Какъв е правилният индекс за запитване на структури в масиви в Postgres jsonb?
За известен, статичен, тривиален брой животни (както коментирахте), предлагам частични индекси като:
CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int))
WHERE (animal ->> 'cow') IS NOT NULL;
CREATE INDEX animal_index ON farm (((animal ->> 'chicken')::int))
WHERE (animal ->> 'chicken') IS NOT NULL;
И т.н.
Може да се наложи да добавите условието за индекс към заявката:
SELECT * FROM farm
WHERE (animal ->> 'cow')::int > 3
AND (animal ->> 'cow') IS NOT NULL;
Може да изглежда излишно, но може да е необходимо. Тествайте с ANALYZE
!