Индекс с една колона
Postgres може да комбинира много ефективно множество индекси в една заявка с сканиране на растерни индекси . През повечето време се избира най-селективният индекс (или два, комбинирани със сканиране на индекс на растерни изображения), а останалата част се филтрира. След като наборът от резултати е достатъчно тесен, не е ефективно да се сканират повече индекси.
Многоколонов индекс
Все още е по-бързо да имате идеално съвпадащ многоколонен индекс, но не по порядък.
Тъй като искате да включите тип масив Предлагам да използвате GIN индекс. AFAIK, операторни класове липсват за GiST индекси с общо предназначение за тип масив. (Изключението е intarray
за integer
масиви.)
За да включите integer
колона, първо инсталирайте допълнителния модул btree_gin
, който предоставя необходимите GIN операторни класове. Изпълнете веднъж на база данни :
CREATE EXTENSION btree_gin;
След това трябва да можете да създадете своя многоколонен индекс:
CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);
Редът на индексните колони е без значение за GIN индексите. Ръководството:
Многоколонен GIN индекс може да се използва с условия на заявка, които включват всяко подмножество от колоните на индекса. За разлика от B-tree или GiST, ефективността на търсенето в индекса е една и съща, независимо коя колона(и) на индекса използват условията на заявката.
Търсене на най-близкия съсед
Тъй като включвате PostGis geometry
тип, вероятно искате да направите търсене на най-близкия съсед, за което имате нужда от GiST индекс. В този случай предлагам две индекси:
CREATE INDEX tbl_ac_gist_idx ON tbl USING GiST(a, c); -- geometry type
CREATE INDEX tbl_bc_gin_idx ON tbl USING GIN(b, c);
Можете да добавите integer
колона c
към едното или и двете. Зависи. За това ви трябва или btree_gin
или btree_gist
или съответно и двете.