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-go лучшие практики
16.04.2024