11.2. Типы индексов#
11.2. Типы индексов #
Tantor BE предоставляет несколько типов индексов:
B-дерево, Hash, GiST, SP-GiST, GIN, BRIN и расширение bloom.
Каждый тип индекса использует различный
алгоритм, который лучше всего подходит для различных типов индексируемых условий.
По умолчанию, команда CREATE
INDEX
создает
индексы B-дерево, которые подходят для большинства ситуаций.
Другие типы индексов выбираются путем написания ключевого слова
USING
с последующим указанием имени типа индекса.
Например, чтобы создать индекс Hash:
CREATE INDEXname
ONtable
USING HASH (column
);
11.2.1. B-дерево #
B-деревья могут обрабатывать запросы на равенство и диапазон на данных, которые можно отсортировать по некоторому порядку. В частности, планировщик запросов Tantor BE будет рассматривать использование индекса B-дерева, когда индексируемый столбец участвует в сравнении с использованием одного из этих операторов:
< <= = >= >
Конструкции, эквивалентные комбинациям этих операторов, такие как
BETWEEN
и IN
, также могут быть реализованы с
помощью поиска по индексу B-дерева. Кроме того, условие IS NULL
или IS NOT
NULL
на столбце индекса может быть использовано с индексом B-дерева.
Оптимизатор также может использовать индекс B-дерево для запросов, включающих операторы сопоставления с образцом LIKE
и ~
если образец является константой и привязан к началу строки - например, col LIKE 'foo%'
или col ~ '^foo'
, но не col LIKE '%bar'
. Однако, если ваша база данных не использует локаль C, вам потребуется создать индекс с использованием специального класса операторов для поддержки индексирования запросов сопоставления с образцом; см. Раздел 11.10 ниже. Также возможно использование индексов B-дерево для ILIKE
и ~*
, но только если образец начинается с неалфавитных символов, то есть символов, которые не подвержены преобразованию верхнего/нижнего регистра.
Индексы В-дерева также могут использоваться для извлечения данных в отсортированном порядке. Это не всегда быстрее, чем простое сканирование и сортировка, но часто полезно.
11.2.2. Хеш #
Хеш-индексы хранят 32-битный хеш-код, полученный из значения индексируемого столбца. Поэтому такие индексы могут обрабатывать только простые операции сравнения на равенство. Планировщик запросов будет рассматривать использование хеш-индекса каждый раз, когда индексируемый столбец участвует в сравнении с использованием оператора равенства:
=
11.2.3. GiST #
Индексы GiST не являются единственным видом индекса, а скорее инфраструктурой, в рамках которой можно реализовать множество различных стратегий индексации. Соответственно, конкретные операторы, с которыми может быть использован индекс GiST, зависят от стратегии индексации (класса операторов). В качестве примера, стандартная дистрибуция Tantor BEвключает классы операторов GiST для нескольких двумерных геометрических типов данных, которые поддерживают индексированные запросы с использованием этих операторов:
<< &< &> >> <<| &<| |&> |>> @> <@ ~= &&
(См. Раздел 9.11 для значения этих операторов).
Классы операторов GiST, включенные в стандартный дистрибутив, документированы в Таблица 65.1.
Множество других классов операторов GiST доступны в коллекции contrib
или в виде отдельных проектов. Дополнительную информацию см. в Глава 65.
Индексы GiST также способны оптимизировать поиск "ближайшего соседа", такого как
SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
который находит десять мест, ближайших к заданной целевой точке. Возможность сделать это снова зависит от конкретного класса операторов, используемого. В Таблица 65.1, операторы, которые могут быть использованы таким образом, перечислены в столбце “Операторы упорядочения”.
11.2.4. SP-GiST #
Индексы SP-GiST, подобно индексам GiST, предлагают инфраструктуру, которая поддерживает различные виды поиска. SP-GiST позволяет реализовать широкий спектр различных несбалансированных дисковых структур данных, таких как квадродеревья, k-d деревья и радикс-деревья (tries). В качестве примера, стандартный дистрибутив Tantor BE включает классы операторов SP-GiST для двумерных точек, которые поддерживают индексированные запросы с использованием этих операторов:
<< >> ~= <@ <<| |>>
(См. Раздел 9.11 для значения этих операторов). Классы операторов SP-GiST, включенные в стандартный дистрибутив, документированы в Таблица 66.1. Дополнительную информацию см. в Глава 66.
Как и GiST, SP-GiST поддерживает поиск “ближайших соседей”. Для классов операторов SP-GiST, поддерживающих упорядочение по расстоянию, соответствующий оператор указан в столбце “Операторы упорядочения” в Таблица 66.1.
11.2.5. GIN #
GIN-индексы - это инвертированные индексы, которые подходят для значений данных, содержащих несколько компонентных значений, таких как массивы. Инвертированный индекс содержит отдельную запись для каждого компонентного значения и может эффективно обрабатывать запросы, которые проверяют наличие конкретных компонентных значений.
Как GiST и SP-GiST, GIN может поддерживать множество различных пользовательских стратегий индексирования, и конкретные операторы, с которыми может использоваться индекс GIN, зависят от стратегии индексирования. В качестве примера, стандартная дистрибуция Tantor BE включает класс операторов GIN для массивов, который поддерживает индексированные запросы с использованием следующих операторов:
<@ @> = &&
(См. Раздел 9.19 для значения этих операторов).
Классы операторов GIN, включенные в стандартный дистрибутив, описаны в Таблица 67.1.
Множество других классов операторов GIN доступны в коллекции contrib
или в виде отдельных проектов. Дополнительную информацию см. в разделе Глава 67.
11.2.6. BRIN #
Индексы BRIN (сокращение от Block Range INdexes) хранят сводки о значениях, хранящихся в последовательных физических блоках таблицы. Таким образом, они наиболее эффективны для столбцов, значения которых хорошо коррелируют с физическим порядком строк таблицы. Как GiST, SP-GiST и GIN, BRIN может поддерживать множество различных стратегий индексирования, и конкретные операторы, с которыми может использоваться индекс BRIN, варьируются в зависимости от стратегии индексирования. Для типов данных, имеющих линейный порядок сортировки, индексируемые данные соответствуют минимальным и максимальным значениям значений в столбце для каждого блочного диапазона. Это поддерживает индексированные запросы, использующие следующие операторы:
< <= = >= >
Операторные классы BRIN, включенные в стандартный дистрибутив, документированы в Таблица 68.1. Дополнительную информацию см. в Глава 68.