В каждом разделе приведены примеры с тестовыми данными и показано, как проверить использование индекса при выполнении запроса.
Индекс MinMax
minmax лучше всего подходит для диапазонных предикатов по слабо отсортированным данным или по столбцам, коррелирующим с ORDER BY.
EXPLAIN и отсечением.
Индекс Set
set, когда локальная (на уровне блока) мощность мала; он неэффективен, если в каждом блоке много различных значений.
Текстовый индекс (text) для полнотекстового поиска
text — это инвертированный индекс для токенизированных текстовых данных.
Он специально разработан для задач полнотекстового поиска и обеспечивает эффективный и детерминированный поиск токенов и терминов.
Рекомендуется для сценариев, связанных с обработкой естественного языка или крупномасштабным поиском по тексту.
Подробнее и примеры см. в разделе Полнотекстовый поиск с текстовыми индексами.
Универсальный bloom-фильтр (скалярный)
bloom_filter хорошо подходит для проверки равенства и принадлежности множеству через IN в сценариях поиска “иголки в стоге сена”. Он принимает необязательный параметр — уровень ложноположительных срабатываний (по умолчанию 0.025).
N-граммный bloom-фильтр (ngrambf_v1) для поиска по подстрокам (Устарело)
Использование индексов
ngrambf_v1 для полнотекстового поиска устарело в версиях ClickHouse >= 26.2; вместо них рекомендуется использовать индексы text (подробнее см. здесь).ngrambf_v1 разбивает строки на n-граммы. Он хорошо подходит для запросов LIKE '%...%'. Поддерживаются String/FixedString/Map (через mapKeys/mapValues), а также настраиваемые размер, количество хеш-функций и seed. Подробнее см. в документации по N-граммному bloom-фильтру.
Token bloom-фильтр (tokenbf_v1) для поиска по словам (Устарело)
Использование индексов
tokenbf_v1 для полнотекстового поиска устарело в версиях ClickHouse >= 26.2; вместо них рекомендуется использовать индексы text (подробнее см. здесь).tokenbf_v1 индексируют токены, разделённые небуквенно-цифровыми символами. Их следует использовать с hasToken, шаблонами слов для LIKE или операторами =/IN. Поддерживаются типы String/FixedString/Map.
Подробнее см. на страницах Token bloom-фильтр и Типы bloom-фильтра.
Добавление индексов при CREATE TABLE (несколько примеров)
Map/Tuple/Nested. Это показано в примере ниже:
Материализация на существующих данных и проверка
MATERIALIZE, а отсечение проверить с помощью EXPLAIN или трассировочных логов, как показано ниже:
Когда использовать индексы пропуска данных, а когда — нет
- Значения, по которым выполняется фильтрация, разреженно распределены внутри блоков данных
- Есть сильная корреляция со столбцами
ORDER BY, либо шаблоны ингестии данных группируют схожие значения - Выполняется текстовый поиск по большим наборам логов (типы
ngrambf_v1/tokenbf_v1)
- Большинство блоков, скорее всего, содержит хотя бы одно подходящее значение (поэтому блоки всё равно будут прочитаны)
- Фильтрация выполняется по столбцам с высокой мощностью без корреляции с порядком данных
Важные замечанияЕсли значение встречается в блоке данных хотя бы один раз, ClickHouse должен прочитать весь блок. Тестируйте индексы на реалистичных датасетах и подбирайте гранулярность и параметры конкретного типа на основе фактических измерений производительности.
Временно игнорировать индексы или принудительно задействовать их
ignore_data_skipping_indices.
Примечания и ограничения
- Индекс пропуска данных поддерживается только для таблиц семейства MergeTree; отсечение данных происходит на уровне гранулы/блока.
- Индексы на основе bloom-фильтров являются вероятностными (ложноположительные срабатывания приводят к дополнительным чтениям, но не к пропуску корректных данных).
- Bloom-фильтры и другие индексы пропуска данных следует проверять с помощью
EXPLAINи трассировки; настраивайте гранулярность, чтобы сбалансировать степень отсечения и размер индекса.