
Индекс
Определение
- Объекты базы данных, предназначенные для ускорения поиска и выборки строк из таблицы, минимизируя количество данных, которые нужно просматривать
- Так же индексы служат для поддержания некоторых ограничений целостности
Как работает?
- Устанавливает соответствие между ключом (наример, значением проиндексированного столбца) и строками таблицы, в которых этот ключ встречается. Строки идентифицируются с помощью TID (tuple id), который состоит из номера блока файла и позиции строки внутри блока.
Увеличение затрат на запись
При любой операции над проиндексированными данными - будь то вставка, удаление или обновление строк таблицы, - индексы, созданные для этой таблицы, должны быть перестроены, причем в рамках той же транзакции.
Типы:
- B-tree
- Hash
- GIN
- GiST
- BRIN
Hash
- Единственная операция, которую поддерживает хеш-индекс, - поиск по условию равенства.
- По мере увеличения количества индексируемых строк одна из корзин расщепляется на две.
- Элементы корзин упорядочены по хеш-кодам ключей, подходящие идентификаторы эффективно находятся двоичным поиском.
- До версии PostgreSQL10 хеш-индексы не журналировались.
Hash
- Кластеризация таблицы по хеш-индексу не предусмотрена
- Поскольку хеш-функция не сохраняет отношение порядка, к хеш-индексу неприменимы свойства, касающиеся упорядоченности.
- Хеш-индекс не может участвовать в сканировании только индекса, поскольку не сохраняет ключ индексации и требует перепроверки по таблице.
- Хеш-индекс не работает с неопределенными значениями: операция «равно» не имеет смысла для NULL.
- Поиск значений из массива нереализован.

- Они сбалансированы, то есть все листья находятся на одной глубине. Поэтому поиск любого значения занимает одинаковое время.
- Они сильно ветвисты, то есть каждый узел содержит много элементов, часто сотни. За счет этого глубина В-деревьев получается небольшой даже для очень больших таблиц.
- Данные в индексе упорядочены по возрастанию как между узлами, так и внутри каждого узла. Узлы одного уровня связаны между собой двунаправленным списком.
B-tree
Поиск по равенству
Поиск по неравенству
Поиск по диапозону
Поиск по префиксу
Оптимизация сортировки
Уникальность
Дубликаты «схлопываются» в одну индексную запись, содержащую ключ и список табличных идентификаторов.
Уникальные индексы могут содержать дубликаты ключей из-за многоверсионности, поскольку индекс хранит ссылки на все версии табличных строк.

GiST (Generalized Search Tree)
- Не конкретный тип индекса, а фреймворк, который позволяет создавать пользовательские реализации для различных видов данных.
R-дерево
- Идея R-дерева состоит в том, что плоскость разбивается на прямоугольники, которые в сумме покрывают все индексируемые точки.
- Индексная запись хранит ограничивающий прямоугольник, а предикат можно сформулировать так: точка лежит внутри данного ограничивающего прямоугольника.
k-NN

R-дерево

- Типичный запрос, ускоряемый индексом, получает все точки, входящие в заданную область.
RD-дерево для полнотекстового поиска
- выбрать из набора документов те, которые соответствуют поисковому запросу.
- Для целей поиска документ приводится к специальному типу tsvector, который содержит лексемы и их позиции в документе.
Полнотекстовый поиск
- Чтобы полнотекстовый поиск работал быстро, его нужно поддержать индексом. Поскольку индексируются не сами документы, а значения na tsvector, есть два варианта: построить индекс по выражению, с ведением типа, или создать отдельный столбец типа tsvector и индексировать его.
RD-дерево
- R-дерево как таковое не годится для индексации документов, поскольку к ним неприменимо понятие ограничивающего прямоугольника. Используется модификация этого подхода — RD-дерево (Russian Doll, матрешка).
- Вместо ограничивающего прямоугольника это дерево использует ограничивающее множество, то есть множество, содержащее все элементы дочерних множеств.
Сигнатурное дерево

- В ней используется фильтр Блума. Каждую лексему можно представить своей сигнатурой: битовой строкой определенной длины, в которой все биты равны нулю (сброшены), кроме одного, который равен единице (установлен). Номер установленного бита определяется значением хеш-функции от лексемы.
Индекс / Аналогия
- предметный указатель в конце книги.В указателе собраны все важные термины, и для каждого приведен список страниц, на которых этот термин упоминается. Чтобы указателем было удобно пользоваться, он оставляется по алфавиту, иначе в нем невозможно было бы быстро ориентироваться. Так и GIN полагается на то,что элементы составных значений можно упорядочить, и в качестве основной структуры использует b-tree
GIN
- Тип индексной структуры, который предназначен для работы с коллекциями данных и для быстрого поиска по составным структурам. Он особенно эффективен для ситуаций, когда одно поле содержит множество значений.
