btree_gin. Показательные классы операторов GIN
В исходном дистрибутиве установлено по умолчанию: нет.
Связанные компоненты: отсутствуют.
Схема размещения:
ext
.
Модуль предоставляет показательные классы операторов GIN
, которые реализуют поведение, подобное поведению обычных классов b-tree
, для следующих типов данных:
int2
;int4
;int8
;float4
;float8
;timestamp with time zone
;timestamp without time zone
;time with time zone
;time without time zone
;date
;interval
;oid
;money
;char
;varchar
;text
;bytea
;bit
;varbit
;macaddr
;macaddr8
;inet
;cidr
;uuid
;name
;bool
;bpchar
;- все типы перечислений (
enum
).
Классы расширения btree_gin
можно применять для тестирования операторов GIN
или взять их за основу для разработки других операторов. Для запросов, где проверяются столбцы с индексом GIN
и индексом-b-tree
, может быть эффективней реали зовать составной индекс GIN
, а не использовать два отдельных индекса.
Описание
Работа с индексами GIN
GIN (Generalized Inverted Index, обратный индекс) – используется преимущественно для полнотекстового поиска.
Для примера, создайте таблицу:
CREATE TABLE users ( first_name text, last_name text );
Заполните ее случайными строками:
INSERT INTO users SELECT md5(random()::text), md5(random()::text) FROM (SELECT * FROM generate_series(1,1000000) AS id) AS x;
Поиск по строке может занимать длительное время:
SELECT count(*) FROM users WHERE first_name ilike '%aeb%';
Для ускорения поиска используйте GIN индекс:
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE INDEX users_search_idx ON users USING gin (first_name gin_trgm_ops, last_name gin_trgm_ops);
где gin_trgm_ops
из расширения pg_trgm
– указание Pangolin использовать триграммы для построения индекса.
Применение GIN на практике не ограничивается использованием расширения pg_trgm
. В данном случае оно выбрано в целях упрощения примера.
Проверьте, что время выполнения запроса уменьшается:
SELECT count(*) FROM users where first_name ilike '%aeb%';
Описание btree_gin
btree_gin
добавляет возможность использовать индекс GIN с операциями, характерными для b-tree
.
Допустим, в таблицу добавилось дополнительное поле с возрастом:
ALTER TABLE users ADD age INTEGER DEFAULT 0;
Если необходимо фильтровать пользователей по возрасту, то использование существующего индекса GIN может оказаться эффективней введения дополнительного BTREE-индекса:
CREATE EXTENSION btree_gin;
DROP INDEX user_search_index;
CREATE INDEX users_search_idx ON users USING gin (first_name gin_trgm_ops, last_name gin_trgm_ops, age);
Теперь можно эффективно фильтровать по возрасту:
EXPLAIN SELECT count(*) FROM users where first_name ilike '%aeb%' and age >= 27;
Так же как и btree_gist
, btree_gin
работает менее эффективно, чем простой b-tree
. Его разумно использовать, если индекс уже включает в себя объекты операции GIN (как в примере выше).
Доработка
Не проводилась.
Ограничения
Существуют следующие ограничения:
- классы операторов
GIN
не будут работать быстрее аналогичных стандартных методов индекса-B-tree
; - нет возможности ограничивать уникальность.
Установка
Расширение входит в стандартную поставку Pangolin. Для использования расширения необходимо выполнить команду:
CREATE EXTENSION btree_gin SCHEMA ext;
Настройка
Не требуется.
Использование модуля
Использование btree_gin
вместо btree
:
CREATE TABLE test (a int4);
-- создать индекс
CREATE INDEX testidx ON test USING GIN (a);
-- запрос
SELECT * FROM test WHERE a < 10;
Ссылки на документацию разработчика
Дополнительно поставляемый модуль btree_gin: https://www.postgresql.org/docs/15/btree-gin.html.