11.2. Типы индексов#

11.2. Типы индексов

11.2. Типы индексов #

Tantor SE-1C предоставляет несколько типов индексов: B-дерево, Hash, GiST, SP-GiST, GIN, BRIN и расширение bloom. Каждый тип индекса использует различный алгоритм, который лучше всего подходит для различных типов индексируемых условий. По умолчанию, команда CREATE INDEX создает индексы B-дерево, которые подходят для большинства ситуаций. Другие типы индексов выбираются путем написания ключевого слова USING с последующим указанием имени типа индекса. Например, чтобы создать индекс Hash:

CREATE INDEX name ON table USING HASH (column);

11.2.1. B-дерево #

B-деревья могут обрабатывать запросы на равенство и диапазон на данных, которые можно отсортировать по некоторому порядку. В частности, планировщик запросов Tantor SE-1C будет рассматривать использование индекса 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 SE-1Cвключает классы операторов 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 SE-1C включает классы операторов 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 SE-1C включает класс операторов 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.