IT заметки по программированию
IT заметки по программированию
IT заметки по программированию
IT заметки по программированию

ClickHouse: minmax и set индексы

В ClickHouse индексы типа minmax и set — это два типа пропускающих индексов (skip indexes), которые позволяют ускорить выполнение запросов, пропуская блоки данных, которые явно не соответствуют запросу. Эти индексы не являются традиционными индексами (как в реляционных базах данных), а скорее служат для оптимизации обработки больших объёмов данных.

Пропускающие индексы в ClickHouse:

Пропускающие индексы помогают избежать проверки всех строк таблицы в запросах. Вместо этого они позволяют ClickHouse пропускать блоки данных, которые точно не могут удовлетворять условиям запроса, на основе метаинформации, такой как минимальные или максимальные значения в блоках данных.

ClickHouse использует такие индексы для ускорения выполнения запросов с фильтрацией по диапазону или точным значениям.

1. Тип индекса minmax

Индекс minmax хранит минимальное и максимальное значение для каждого блока данных. Этот индекс полезен в основном для диапазонных запросов. Он позволяет ClickHouse быстро пропускать блоки данных, которые не попадают в диапазон, указанный в запросе.

Как работает minmax:

  • Для каждого блока данных (например, партиции) ClickHouse сохраняет минимальное и максимальное значение для указанного поля.
  • Когда приходит запрос с диапазонной фильтрацией (например, WHERE value BETWEEN 10 AND 20), ClickHouse проверяет минимальное и максимальное значение в блоке данных.
  • Если минимальное значение больше 20 или максимальное значение меньше 10, блок данных можно пропустить, поскольку он не может содержать подходящих значений.

Пример использования:

В этом примере:

  • Пропускающий индекс idx_amount используется для поля amount.
  • Тип индекса — minmax, который сохраняет минимальные и максимальные значения в блоках.
  • GRANULARITY 4 означает, что индекс будет обновляться каждые 4 строки.

Когда использовать minmax:

  • Полезен для диапазонных запросов. Например, если у вас есть временные данные, и вы часто фильтруете их по диапазону времени (например, по полю created_at), индекс типа minmax поможет ускорить фильтрацию.
  • Применим для числовых данных или временных меток, где диапазон значений имеет смысл.

Пример запроса, который использует minmax:

ClickHouse будет проверять минимальное и максимальное значение в каждом блоке для поля amount и пропускать блоки, где это поле не попадает в диапазон от 10 до 100.


2. Тип индекса set

Индекс set используется для хранения уникальных значений в наборе. Этот тип индекса более эффективен для запросов, где фильтрация происходит по точным значениям (например, когда вы ищете строки с конкретными значениями).

Как работает set:

  • Этот индекс хранит набор значений для каждого блока. Он может быть полезен для полей, где возможны несколько уникальных значений, и вы хотите быстро определить, содержится ли нужное значение в блоке данных.
  • Когда приходит запрос, в котором есть фильтрация по точным значениям (например, WHERE name = 'Alice'), индекс типа set позволяет пропустить блоки, в которых нет этого значения.

Пример использования:

В этом примере:

  • Пропускающий индекс idx_name используется для поля name.
  • Тип индекса — set(0), который хранит набор уникальных значений поля name.
  • GRANULARITY 4 означает, что индекс будет обновляться каждые 4 строки.

Когда использовать set:

  • Полезен для строковых полей или полей, где могут быть несколько уникальных значений. Например, если у вас есть поле с категориями или идентификаторами пользователей, индекс типа set поможет эффективно находить соответствующие строки.
  • Применим для точных совпадений, где запрос фильтрует по конкретным значениям (например, WHERE name = 'Alice').

Пример запроса, который использует set:

ClickHouse будет проверять, содержится ли значение Alice в блоках данных, и пропустит блоки, где это значение отсутствует.


Основные различия между minmax и set:

Характеристика minmax set
Тип данных Числовые, временные (например, UInt64, DateTime) Строки, категориальные данные (например, String)
Метод хранения Минимальное и максимальное значение для блока данных Множество уникальных значений для блока данных
Когда использовать Диапазонные запросы (например, BETWEEN, сравнение по диапазону) Точные совпадения (например, = для конкретных значений)
Тип данных Хорошо работает с числовыми и временными типами Хорошо работает с категориальными или строковыми типами

Когда и какие индексы использовать:

  • minmax: Если вам нужно ускорить диапазонные запросы (например, фильтрация по времени или числовым значениям), используйте minmax. Например, если вы часто фильтруете записи по дате или диапазону значений, minmax будет полезен.
  • set: Если вам нужно ускорить фильтрацию по точным значениям, например, для поиска конкретных строк с уникальными значениями (например, по имени пользователя или категории), то используйте индекс типа set.

Итог:

  • minmax — лучший выбор для диапазонных фильтров.
  • set — лучший выбор для точных совпадений.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *