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, блок данных можно пропустить, поскольку он не может содержать подходящих значений.
Пример использования:
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE example_table ( id UInt64, name String, created_at DateTime, amount Float32, INDEX idx_amount (amount) TYPE minmax GRANULARITY 4 -- Пропускающий индекс minmax ) ENGINE = MergeTree() ORDER BY (created_at); |
- Пропускающий индекс
idx_amount
используется для поляamount
. - Тип индекса —
minmax
, который сохраняет минимальные и максимальные значения в блоках. - GRANULARITY 4 означает, что индекс будет обновляться каждые 4 строки.
Когда использовать minmax
:
- Полезен для диапазонных запросов. Например, если у вас есть временные данные, и вы часто фильтруете их по диапазону времени (например, по полю
created_at
), индекс типаminmax
поможет ускорить фильтрацию. - Применим для числовых данных или временных меток, где диапазон значений имеет смысл.
Пример запроса, который использует minmax
:
1 2 3 4 |
SELECT * FROM example_table WHERE amount BETWEEN 10 AND 100; |
amount
и пропускать блоки, где это поле не попадает в диапазон от 10 до 100.
2. Тип индекса set
Индекс set
используется для хранения уникальных значений в наборе. Этот тип индекса более эффективен для запросов, где фильтрация происходит по точным значениям (например, когда вы ищете строки с конкретными значениями).
Как работает set
:
- Этот индекс хранит набор значений для каждого блока. Он может быть полезен для полей, где возможны несколько уникальных значений, и вы хотите быстро определить, содержится ли нужное значение в блоке данных.
- Когда приходит запрос, в котором есть фильтрация по точным значениям (например,
WHERE name = 'Alice'
), индекс типаset
позволяет пропустить блоки, в которых нет этого значения.
Пример использования:
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE example_table ( id UInt64, name String, created_at DateTime, amount Float32, INDEX idx_name (name) TYPE set(0) GRANULARITY 4 -- Пропускающий индекс set ) ENGINE = MergeTree() ORDER BY (created_at); |
- Пропускающий индекс
idx_name
используется для поляname
. - Тип индекса —
set(0)
, который хранит набор уникальных значений поляname
. - GRANULARITY 4 означает, что индекс будет обновляться каждые 4 строки.
Когда использовать set
:
- Полезен для строковых полей или полей, где могут быть несколько уникальных значений. Например, если у вас есть поле с категориями или идентификаторами пользователей, индекс типа
set
поможет эффективно находить соответствующие строки. - Применим для точных совпадений, где запрос фильтрует по конкретным значениям (например,
WHERE name = 'Alice'
).
Пример запроса, который использует set
:
1 2 3 4 |
SELECT * FROM example_table WHERE name = 'Alice'; |
Alice
в блоках данных, и пропустит блоки, где это значение отсутствует.
Основные различия между minmax
и set
:
Характеристика | minmax |
set |
---|---|---|
Тип данных | Числовые, временные (например, UInt64 , DateTime ) |
Строки, категориальные данные (например, String ) |
Метод хранения | Минимальное и максимальное значение для блока данных | Множество уникальных значений для блока данных |
Когда использовать | Диапазонные запросы (например, BETWEEN , сравнение по диапазону) |
Точные совпадения (например, = для конкретных значений) |
Тип данных | Хорошо работает с числовыми и временными типами | Хорошо работает с категориальными или строковыми типами |
Когда и какие индексы использовать:
minmax
: Если вам нужно ускорить диапазонные запросы (например, фильтрация по времени или числовым значениям), используйтеminmax
. Например, если вы часто фильтруете записи по дате или диапазону значений,minmax
будет полезен.set
: Если вам нужно ускорить фильтрацию по точным значениям, например, для поиска конкретных строк с уникальными значениями (например, по имени пользователя или категории), то используйте индекс типаset
.
Итог:
minmax
— лучший выбор для диапазонных фильтров.set
— лучший выбор для точных совпадений.
Recommended Posts
clickhouse-go лучшие практики
16.04.2024