Индексы

пятница, окт. 10, 2025 | 3 минуты чтения

Индексы

Индекс

Определение

  • Объекты базы данных, предназначенные для ускорения поиска и выборки строк из таблицы, минимизируя количество данных, которые нужно просматривать
  • Так же индексы служат для поддержания некоторых ограничений целостности

Как работает?

  • Устанавливает соответствие между ключом (наример, значением проиндексированного столбца) и строками таблицы, в которых этот ключ встречается. Строки идентифицируются с помощью 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

  • Тип индексной структуры, который предназначен для работы с коллекциями данных и для быстрого поиска по составным структурам. Он особенно эффективен для ситуаций, когда одно поле содержит множество значений.