Примеры индексов пропуска данных
На этой странице собраны примеры индексов пропуска данных ClickHouse, показано, как объявить каждый тип, когда их использовать и как проверить, что они используются. Все возможности работают с таблицами семейства MergeTree.
Синтаксис индекса:
ClickHouse поддерживает пять типов индексов пропуска данных:
| Index Type | Description |
|---|---|
| minmax | Отслеживает минимальные и максимальные значения в каждой грануле |
| set(N) | Хранит до N различных значений в каждой грануле |
| bloom_filter([false_positive_rate]) | Вероятностный фильтр для проверки наличия значений |
| ngrambf_v1 | N-граммовый bloom-фильтр для поиска подстрок |
| tokenbf_v1 | Bloom-фильтр на основе токенов для полнотекстового поиска |
В каждом разделе приводятся примеры с демонстрационными данными и показывается, как проверить использование индекса при выполнении запроса.
Индекс MinMax
Индекс minmax лучше всего подходит для диапазонных предикатов по слабо упорядоченным данным или по столбцам, коррелированным с ORDER BY.
См. подробный пример с EXPLAIN и отсечением данных.
Индекс set
Используйте индекс set, когда локальная кардинальность на уровне блока низкая; он неэффективен, если в каждом блоке много различных значений.
Процесс создания и материализации, а также эффект до/после показаны в базовом руководстве по работе.
Универсальный Bloom-фильтр (скалярный)
Индекс bloom_filter хорошо подходит для поиска «иголки в стоге сена» по условию равенства или проверки принадлежности (оператор IN). Он принимает необязательный параметр — вероятность ложноположительных срабатываний (по умолчанию 0.025).
N-граммный фильтр Блума (ngrambf_v1) для поиска подстрок
Индекс ngrambf_v1 разбивает строки на n-граммы. Он хорошо подходит для запросов вида LIKE '%...%'. Поддерживаются типы String/FixedString/Map (через mapKeys/mapValues), а также настраиваемые размер, количество хэшей и значение seed. Дополнительные сведения см. в документации по N-граммному фильтру Блума.
В этом руководстве приведены практические примеры и указано, в каких случаях использовать token, а в каких — ngram.
Вспомогательные инструменты для оптимизации параметров:
Четыре параметра ngrambf_v1 (размер n-граммы, размер битовой карты, количество хеш-функций, seed) существенно влияют на производительность и потребление памяти. Используйте эти функции, чтобы вычислить оптимальный размер битовой карты и количество хеш-функций исходя из ожидаемого объёма n-грамм и требуемой доли ложноположительных срабатываний:
См. документацию по параметрам для получения подробных рекомендаций по настройке.
Токен-блум-фильтр (tokenbf_v1) для поиска по словам
tokenbf_v1 индексирует токены, разделённые небуквенно-цифровыми символами. Используйте его с hasToken, с шаблонами слов LIKE или с операторами равенства (=) и IN. Поддерживает типы String/FixedString/Map.
См. разделы Token bloom filter и Bloom filter types для получения дополнительной информации.
См. примеры по наблюдаемости и рекомендации по выбору token vs ngram здесь.
Добавление индексов при выполнении CREATE TABLE (несколько примеров)
Индексы пропуска данных также поддерживают составные выражения и типы Map/Tuple/Nested. Это показано в примере ниже:
Материализация индекса на существующих данных и проверка
Вы можете добавить индекс к уже существующим частям данных с помощью MATERIALIZE и проверить отсечение с помощью EXPLAIN или трассировочных журналов, как показано ниже:
Этот подробный пример с minmax демонстрирует структуру вывода EXPLAIN и счётчики отсечения.
Когда использовать и когда избегать индексов пропуска данных
Используйте индексы пропуска данных, когда:
- Значения фильтра редко встречаются внутри блоков данных
- Существует сильная корреляция со столбцами
ORDER BYили шаблоны ингестии данных группируют похожие значения вместе - Выполняется текстовый поиск по большим наборам логов (типы
ngrambf_v1/tokenbf_v1)
Избегайте индексов пропуска данных, когда:
- Большинство блоков, скорее всего, содержит хотя бы одно совпадающее значение (блоки всё равно будут прочитаны)
- Фильтрация выполняется по высококардинальным столбцам без корреляции с порядком хранения данных
Если значение встречается хотя бы один раз в блоке данных, ClickHouse должен прочитать весь блок. Тестируйте индексы на реалистичных наборах данных и корректируйте гранулярность и зависящие от типа параметры на основе фактических показателей производительности.
Временно игнорировать или принудительно использовать индексы
Отключайте отдельные индексы по имени для конкретных запросов во время тестирования и устранения неполадок. Также доступны настройки для принудительного использования индексов при необходимости. См. ignore_data_skipping_indices.
Примечания и ограничения
- Индексы пропуска данных поддерживаются только для таблиц семейства MergeTree; отсечение данных выполняется на уровне гранулы/блока.
- Индексы на основе Bloom-фильтра являются вероятностными (ложные срабатывания приводят к дополнительным чтениям, но не приводят к пропуску корректных данных).
- Bloom-фильтры и другие индексы пропуска данных следует проверять с помощью
EXPLAINи трассировки; подбирайте гранулярность, чтобы сбалансировать степень отсечения данных и размер индекса.