Когда B-Tree недостаточно, в дело вступают специализированные алгоритмы. Каждый из них создан под узкую задачу: от поиска по опечатке до расчета кратчайшего пути курьера.
1. Hash-индексы: Скорость ценой гибкости
Работает как обычная хэш-таблица. База пропускает ключ через хэш-функцию и мгновенно получает адрес строки. Это дает сложность O(1) — поиск по миллиону UUID или длинных URL происходит моментально.
| Плюс | Минус |
|---|---|
| Константная скорость при поиске по точному равенству (UUID, URL). | Бесполезен для диапазонов (BETWEEN, >), сортировки или LIKE запросов. |
| Индекс очень компактный (хранится только хэш). | Могут возникать коллизии, замедляющие работу при плохих хэш-функциях. |
2. Bitmap-индексы: супер для аналитики
Вместо дерева здесь используются битовые векторы (массивы из 0 и 1). Это идеально работает, когда у данных мало уникальных значений (Low Cardinality). Например, пол, статус заказа или страна.
Почему это быстро: Процессоры умеют делать битовые операции (AND/OR) на аппаратном уровне невероятно быстро. Если тебе нужно найти «Всех мужчин ИЗ Германии СО статусом Active», база просто сложит три битовые маски. Но будь осторожен: любая запись (INSERT) блокирует весь Bitmap-индекс, поэтому их используют только в аналитических хранилищах.
3. Инвертированный индекс: Мозг поисковиков
Если B-Tree ищет строку целиком, то инвертированный индекс разбирает её на части (токены). Он хранит словарь слов, где для каждого слова записан список ID документов, в которых оно встречается.
- Где встречается: Основа Elasticsearch и Lucene. В PostgreSQL реализован через модуль GIN (Generalized Inverted Index).
- Задача: Полнотекстовый поиск, поиск по элементам JSON-массивов.
4. Пространственные индексы (R-Tree / GiST)
Обычное дерево не понимает, что такое «находиться внутри круга» или «пересекать полигон». Для этого используются R-деревья, которые группируют объекты в иерархию прямоугольников (Bounding Boxes).
| Задача | Оптимальный алгоритм |
|---|---|
| «Найти все точки в радиусе 500м» | R-Tree (через GiST в Postgres) |
| Плотные GPS-потоки и Heat-maps | Quad-Tree или KD-Tree |
Пространственные индексы будем разбирать отдельно