Индексы в БД позволяют сильно ускорить поиск по БД.
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% веса таблицы