Skip to main content
На этой странице собраны примеры индексов пропуска данных в ClickHouse: показано, как объявлять каждый тип, когда их использовать и как проверять, что они действительно применяются. Все эти возможности поддерживаются таблицами семейства MergeTree. Синтаксис индекса:
ClickHouse поддерживает шесть типов индекса пропуска данных: В каждом разделе приведены примеры с тестовыми данными и показано, как проверить использование индекса при выполнении запроса.

Индекс MinMax

Индекс minmax лучше всего подходит для диапазонных предикатов по слабо отсортированным данным или по столбцам, коррелирующим с ORDER BY.
См. разобранный пример с EXPLAIN и отсечением.

Индекс Set

Используйте индекс set, когда локальная (на уровне блока) мощность мала; он неэффективен, если в каждом блоке много различных значений.
Процесс создания и материализации, а также результат до и после, показаны в руководстве по основным операциям. text — это инвертированный индекс для токенизированных текстовых данных. Он специально разработан для задач полнотекстового поиска и обеспечивает эффективный и детерминированный поиск токенов и терминов. Рекомендуется для сценариев, связанных с обработкой естественного языка или крупномасштабным поиском по тексту. Подробнее и примеры см. в разделе Полнотекстовый поиск с текстовыми индексами.
Более подробный пример обсервабилити см. в документации здесь. Текстовый индекс полностью детерминирован и гибко настраивается с точки зрения токенизации и обработки текста, но требует несколько больше места в хранилище по сравнению с индексами на основе фильтра Блума,

Универсальный bloom-фильтр (скалярный)

Индекс bloom_filter хорошо подходит для проверки равенства и принадлежности множеству через IN в сценариях поиска “иголки в стоге сена”. Он принимает необязательный параметр — уровень ложноположительных срабатываний (по умолчанию 0.025).
Использование индексов ngrambf_v1 для полнотекстового поиска устарело в версиях ClickHouse >= 26.2; вместо них рекомендуется использовать индексы text (подробнее см. здесь).
Индекс ngrambf_v1 разбивает строки на n-граммы. Он хорошо подходит для запросов LIKE '%...%'. Поддерживаются String/FixedString/Map (через mapKeys/mapValues), а также настраиваемые размер, количество хеш-функций и seed. Подробнее см. в документации по N-граммному bloom-фильтру.
В этом руководстве приведены практические примеры и объясняется, когда использовать token, а когда ngram. Вспомогательные функции для оптимизации параметров: Четыре параметра ngrambf_v1 (размер n-граммы, размер битмапа, хеш-функции, seed) существенно влияют на производительность и использование памяти. Используйте эти функции, чтобы рассчитать оптимальный размер битмапа и количество хеш-функций на основе ожидаемого объёма n-грамм и требуемой частоты ложноположительных срабатываний:
См. документацию по параметрам для получения подробных рекомендаций по настройке.
Использование индексов tokenbf_v1 для полнотекстового поиска устарело в версиях ClickHouse >= 26.2; вместо них рекомендуется использовать индексы text (подробнее см. здесь).
Индексы tokenbf_v1 индексируют токены, разделённые небуквенно-цифровыми символами. Их следует использовать с hasToken, шаблонами слов для LIKE или операторами =/IN. Поддерживаются типы String/FixedString/Map. Подробнее см. на страницах Token bloom-фильтр и Типы bloom-фильтра.
См. примеры по обсервабилити и рекомендации по выбору между токенами и n-граммами здесь.

Добавление индексов при CREATE TABLE (несколько примеров)

Индексы пропуска данных также поддерживают составные выражения и типы Map/Tuple/Nested. Это показано в примере ниже:

Материализация на существующих данных и проверка

Вы можете добавить индекс к существующим частям данных с помощью MATERIALIZE, а отсечение проверить с помощью EXPLAIN или трассировочных логов, как показано ниже:
Этот разобранный пример minmax демонстрирует структуру вывода EXPLAIN и количество отсечений.

Когда использовать индексы пропуска данных, а когда — нет

Используйте индексы пропуска данных, когда:
  • Значения, по которым выполняется фильтрация, разреженно распределены внутри блоков данных
  • Есть сильная корреляция со столбцами ORDER BY, либо шаблоны ингестии данных группируют схожие значения
  • Выполняется текстовый поиск по большим наборам логов (типы ngrambf_v1/tokenbf_v1)
Избегайте индексов пропуска данных, когда:
  • Большинство блоков, скорее всего, содержит хотя бы одно подходящее значение (поэтому блоки всё равно будут прочитаны)
  • Фильтрация выполняется по столбцам с высокой мощностью без корреляции с порядком данных
Важные замечанияЕсли значение встречается в блоке данных хотя бы один раз, ClickHouse должен прочитать весь блок. Тестируйте индексы на реалистичных датасетах и подбирайте гранулярность и параметры конкретного типа на основе фактических измерений производительности.

Временно игнорировать индексы или принудительно задействовать их

Отключайте определённые индексы по имени для отдельных запросов во время тестирования и диагностики. При необходимости также доступны настройки, позволяющие принудительно использовать индексы. См. ignore_data_skipping_indices.

Примечания и ограничения

  • Индекс пропуска данных поддерживается только для таблиц семейства MergeTree; отсечение данных происходит на уровне гранулы/блока.
  • Индексы на основе bloom-фильтров являются вероятностными (ложноположительные срабатывания приводят к дополнительным чтениям, но не к пропуску корректных данных).
  • Bloom-фильтры и другие индексы пропуска данных следует проверять с помощью EXPLAIN и трассировки; настраивайте гранулярность, чтобы сбалансировать степень отсечения и размер индекса.
Последнее изменение 3 июля 2026 г.