Какие виды индексов существуют
Что проверяют
Понимаете ли вы, что в аналитике и ML индексы выглядят иначе, чем в классическом бэкенде: колоночные хранилища, партиции, векторный поиск. Следом часто просят объяснить, почему запрос к большой таблице событий всё равно читает её целиком.
Как отвечать
Стоит пройтись по трём мирам. Строчные базы, на примере PostgreSQL:
- B-tree: тип по умолчанию, равенство, диапазоны, сортировка. Составной работает слева направо;
- GIN:
jsonb, массивы и полнотекстовый поиск, отвечает на вопрос «в каких строках есть этот элемент»; - BRIN: хранит минимум и максимум для диапазонов страниц. Крошечный и отлично подходит таблицам событий, где строки лежат в порядке времени;
- частичные, по выражению и покрывающие (
INCLUDE): точечные ускорители под конкретные запросы.
В ClickHouse индексов в привычном смысле нет. Первичный ключ разреженный: одна метка на гранулу, по умолчанию 8192 строки, поэтому скорость решает порядок ORDER BY таблицы. Поверх ставят индексы пропуска данных: minmax, set, bloom_filter.
Для эмбеддингов нужны индексы приближённого поиска ближайших соседей:
- HNSW: граф, высокая полнота и скорость, но много памяти и долгая сборка. В pgvector настраивается через
m,ef_constructionиhnsw.ef_search; - IVFFlat: разбиение на кластеры, строится быстро, качество зависит от
listsиivfflat.probes, строить его стоит после загрузки данных.
В FAISS для векторов, которые не помещаются в память, добавляют сжатие PQ.
Где спотыкаются
Переносят логику B-tree на ClickHouse и ждут, что skip-индекс по случайной колонке ускорит всё. Он помогает, только если значения сгруппированы внутри гранул, иначе читаются те же данные плюс сам индекс.
Забывают, что HNSW и IVFFlat приближённые. С фильтром WHERE поверх векторного поиска выдача может оказаться короче LIMIT, в свежих версиях pgvector для этого есть итеративное сканирование. Полноту стоит мерить на отложенной выборке, сравнивая с точным поиском.
При массовой загрузке оставляют все индексы включёнными. Быстрее залить данные и построить индексы после, особенно векторные.