- minmax: Отслеживает минимальное и максимальное значение выражения для каждого блока. Идеально подходит для диапазонных запросов по слабо отсортированным данным.
- set(N): Отслеживает набор значений до указанного размера N для каждого блока. Эффективен для столбцов с низкой мощностью в пределах блоков.
- text: Строит инвертированный индекс по токенизированным строковым данным, обеспечивая эффективный и детерминированный полнотекстовый поиск. Рекомендуется для текстов на естественном языке или больших столбцов с произвольным текстом, где требуются точный поиск по токенам и масштабируемый поиск по нескольким терминам, вместо приближенных подходов на основе Bloom filter.
- bloom_filter: Вероятностно определяет, присутствует ли значение в блоке, что позволяет быстро выполнять приближенную фильтрацию на принадлежность множеству. Эффективен для оптимизации запросов вида «иголка в стоге сена», когда требуется найти положительное совпадение.
- tokenbf_v1 / ngrambf_v1: (Устарело) Специализированные варианты Bloom filter, предназначенные для поиска токенов или последовательностей символов в строках — особенно полезны для данных логов или сценариев текстового поиска. Устарели в версиях ClickHouse >= 26.2 в пользу текстовых индексов.
- Столбцов с высокой общей мощностью, но низкой мощностью внутри блока.
- Редких значений, критически важных для поиска (например, кодов ошибок, конкретных ID).
- Случаев, когда фильтрация выполняется по столбцам, не входящим в первичный ключ, при локализованном распределении данных.
- Тестируйте индексы пропуска данных на реальных данных с реалистичными запросами. Пробуйте разные типы индексов и значения гранулярности.
- Оценивайте их влияние с помощью таких инструментов, как send_logs_level=‘trace’ и
EXPLAIN indexes=1, чтобы увидеть эффективность индекса. - Всегда оценивайте размер индекса и то, как на него влияет гранулярность. Уменьшение гранулярности часто повышает производительность до определенного предела, поскольку позволяет отфильтровывать больше гранул и уменьшать объем сканирования. Однако по мере роста размера индекса при меньшей гранулярности производительность также может ухудшаться. Измеряйте производительность и размер индекса для разных значений гранулярности. Это особенно актуально для индексов Bloom filter.
Пример
EXPLAIN indexes = 1:
ViewCount коррелирует с CreationDate (первичным ключом), как и следовало ожидать: чем дольше существует публикация, тем больше у неё просмотров.
ALTER TABLE — сначала добавим его, а затем “материализуем”.
ViewCount для каждого блока строк (гранулы) в таблице:
Повторив предыдущий запрос, можно увидеть заметное повышение производительности. Обратите внимание на уменьшение числа просканированных строк:
EXPLAIN indexes = 1 подтверждает, что индекс используется.
ViewCount > 10,000,000 в нашем примере запроса: