Skip to main content

Базы данных. SQL. Hash индекс

Индексы в БД позволяют сильно ускорить поиск по БД.

Hash индексы не исключение, но у них есть своя специфика

Как он работает:

1. К каждому значению в столбце применяется специальная функция (hash) и превращает в фиксированное число.

2. Это число используется, чтобы определить, в какой бакет (ячейку) положить значение. Бакеты — это внутренняя структура hash-индекса

3. При поиске база данных сразу вычисляет hash от искомого значения и переходит напрямую в нужный бакет, не просматривая всю таблицу

Допустим у нас есть столбец X. Применим hash-преобразование к каждой строке:

‘hello’ -> hash(‘hello’) -> 8347261 -> бакет1

‘world’ -> hash(‘world’) -> 9123845 -> бакет2

‘hello’ -> hash(‘hello’) -> 8347261 -> бакет1

‘admin’ -> hash(‘admin’) -> 5274938 -> бакет3

‘admins’ -> hash(‘admins’) -> 1840265 -> бакет4

1. Одинаковые значения дают одинаковый hash и попадают в один бакет

2. Раньше, при написании SELECT БД шло по каждой строке

3. Теперь, при написании SELECT БД сразу высчитывает hash в столбце и идет напрямую в бакет, где лежит нужное нам значение

Hash-индексы работают только для точного равенства: WHERE column = value .

Пример

Кейс: быстрый поиск по точному совпадению

Условия

• используется PostgreSQL

• Очень большая таблица (миллионы строк)

• очень частые запросы вида =

• Не нужны диапазоны и сортировки

Например: таблица с API-токенами, ведь нам всегда нужно находить уникальное значение, не сравнивая с другими.

————

Почему тогда индексы не используются в каждом столбце каждой таблице, раз они так ускоряют поиск?

Есть 2 главные причины:

1. Они постоянно пересчитываются/перераспределяются при вставке новых данных

2. Они занимают много места. От 30 до 100% веса таблицы