ClickHouse: особенности индексирования
В ClickHouse нет возможности создавать отдельные индексы по каждому полю в традиционном понимании, как это делается в реляционных СУБД (например, отдельный индекс для каждого поля). Вместо этого ClickHouse использует механизмы, которые помогают улучшить производительность запросов с фильтрацией по отдельным полям.
В ClickHouse можно создать пропускающие индексы (skip indexes), которые создаются по отдельным полям, а не по составному индексу, как в случае с ORDER BY.
Пропускающие индексы (Skip Indexes)
Пропускающие индексы — это индексы, которые позволяют ClickHouse пропускать большие блоки данных, если они не соответствуют запросу, тем самым ускоряя выполнение запросов. Эти индексы можно создать по каждому полю, и они будут использоваться в запросах, которые фильтруют данные по этим полям.
Пример создания пропускающих индексов по каждому полю
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CREATE TABLE example_table ( id UInt64, name String, created_at DateTime, amount Float32, INDEX idx_id (id) TYPE minmax GRANULARITY 1, -- Пропускающий индекс по полю id INDEX idx_name (name) TYPE set(0) GRANULARITY 4, -- Пропускающий индекс по полю name INDEX idx_created_at (created_at) TYPE minmax GRANULARITY 1, -- Пропускающий индекс по полю created_at INDEX idx_amount (amount) TYPE minmax GRANULARITY 1 -- Пропускающий индекс по полю amount ) ENGINE = MergeTree() ORDER BY (created_at, id); -- Основной составной индекс |
Объяснение:
INDEX idx_id (id) TYPE minmax GRANULARITY 1— Пропускающий индекс для поляid. Тип индекса —minmax, что означает, что для этого поля будет храниться минимальное и максимальное значение в каждом блоке данных.INDEX idx_name (name) TYPE set(0) GRANULARITY 4— Пропускающий индекс для поляname. Тип индекса —set(0), оптимизированный для поиска точных совпадений.INDEX idx_created_at (created_at) TYPE minmax GRANULARITY 1— Пропускающий индекс для поляcreated_at.INDEX idx_amount (amount) TYPE minmax GRANULARITY 1— Пропускающий индекс для поляamount.
Типы пропускающих индексов:
- minmax: Индекс для хранения минимальных и максимальных значений для каждой партиции данных. Используется для эффективного поиска по диапазонам (например, числовые или временные поля).
- set(0): Индекс, использующий структуру данных Set, оптимизирован для точных совпадений. Полезен для строковых или категориальных данных.
Как это работает:
minmax— Используется для полей с диапазонными значениями (например, числовые и временные типы), ускоряя запросы, фильтрующие данные по диапазону (например, по времени).set(0)— Индекс для точного поиска, часто используется для строк, когда нужно быстро проверить наличие значения.
Пример запроса с использованием пропускающих индексов:
|
1 2 3 4 |
SELECT * FROM example_table WHERE id = 1234; |
Recommended Posts
ClickHouse в вопросах и ответах
28.04.2024
