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.