ClickHouse: большой составной индекс в ORDER BY или пропускающие индексы по каждому полю
В ClickHouse выбор между составным индексом в ORDER BY
и пропускающими индексами по каждому полю зависит от того, как именно вы планируете выполнять запросы, какие операции вам нужно ускорить, и какие данные обрабатываются в вашей таблице. Рассмотрим оба подхода и их преимущества.
1. Составной индекс в ORDER BY
Составной индекс создается при указании нескольких полей в выражении ORDER BY
при создании таблицы. В ClickHouse это не традиционный индекс, а скорее способ организации данных, чтобы ускорить выполнение запросов с фильтрацией или сортировкой по этим полям.
Преимущества:
- Оптимизация запросов с сортировкой: Если ваши запросы часто включают сортировку по этим полям или фильтрацию, то составной индекс в
ORDER BY
позволяет ClickHouse эффективно организовать данные в хранилище. Это ускоряет выполнение запросов, так как данные уже отсортированы по нужным полям. - Лучше для диапазонных запросов: Если запросы фильтруют данные по диапазонам нескольких полей одновременно (например,
WHERE field1 = x AND field2 BETWEEN y AND z
), составной индекс вORDER BY
будет очень эффективным, так как данные будут отсортированы, и ClickHouse сможет пропускать блоки данных, не подходящие под запрос.
Недостатки:
- Гибкость: Составной индекс хорош для определённых типов запросов, но не так гибок для других случаев. Например, если запрос фильтрует только одно поле из нескольких в
ORDER BY
, то эффективность может снизиться. - Ресурсы: Большие составные индексы могут занимать много памяти и увеличить время вставки данных, так как данные должны быть организованы в соответствии с этим индексом.
Пример составного индекса:
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE example_table ( id UInt64, category String, created_at DateTime, amount Float32, INDEX idx_category_created_at (category, created_at) GRANULARITY 4 ) ENGINE = MergeTree() ORDER BY (category, created_at); |
- Данные сортируются по полям
category
иcreated_at
. - Это полезно для запросов, которые фильтруют или сортируют по этим полям (например,
WHERE category = 'x' AND created_at BETWEEN '2020-01-01' AND '2020-12-31'
).
2. Пропускающие индексы по каждому полю
Пропускающие индексы (например, индексы типа minmax
или set
) создаются на отдельных полях, и они позволяют ClickHouse пропускать блоки данных, которые не соответствуют условиям запроса.
Преимущества:
- Гибкость: Пропускающие индексы можно использовать для оптимизации разных типов запросов. Например, можно создавать отдельные индексы для каждого поля, что позволяет ускорить запросы, которые фильтруют по любому из этих полей.
- Подходит для точных совпадений или диапазонов: Пропускающие индексы типа
set
идеально подходят для точных совпадений по значениям в поле (например,WHERE category = 'x'
), а индексы типаminmax
эффективны для диапазонных запросов (например,WHERE created_at BETWEEN '2020-01-01' AND '2020-12-31'
). - Менее ресурсоемко при вставке данных: Пропускающие индексы не требуют такой же сортировки данных, как составной индекс в
ORDER BY
, что снижает нагрузку при вставке данных.
Недостатки:
- Не так эффективно при сложных запросах с несколькими фильтрами: Если запрос использует фильтры по нескольким полям одновременно (например,
WHERE field1 = x AND field2 = y
), то несколько отдельных пропускающих индексов могут не быть такими эффективными, как один составной индекс, который уже организует данные по этим полям. - Могут потребовать большего объема памяти: Пропускающие индексы для каждого поля могут занимать больше памяти, чем один составной индекс, если данных в таблице много.
Пример пропускающих индексов:
1 2 3 4 5 6 7 8 9 10 11 |
CREATE TABLE example_table ( id UInt64, category String, created_at DateTime, amount Float32, INDEX idx_category (category) TYPE set(0) GRANULARITY 4, INDEX idx_created_at (created_at) TYPE minmax GRANULARITY 4 ) ENGINE = MergeTree() ORDER BY (id); |
- Индексы создаются по полям
category
иcreated_at
отдельно. - Это полезно для запросов, которые фильтруют только по одному из этих полей (например,
WHERE category = 'x'
илиWHERE created_at > '2020-01-01'
).
Когда что выбрать?
Когда выбрать составной индекс в ORDER BY
:
- Если ваши запросы часто выполняют сортировку по нескольким полям одновременно.
- Если ваши запросы фильтруют данные по нескольким полям, которые перечислены в
ORDER BY
, например,WHERE field1 = x AND field2 = y
. - Если вам важна оптимизация запросов с диапазонными фильтрами на этих полях (например,
BETWEEN
,>=
,<=
).
Когда выбрать пропускающие индексы по каждому полю:
- Если ваши запросы фильтруют данные только по одному или нескольким полям, которые не входят в
ORDER BY
. - Если вам нужно ускорить точные совпадения по полям (например,
WHERE field = 'x'
). - Если вам нужна гибкость для ускорения различных типов запросов с фильтрацией по разным полям.
Итог:
- Составной индекс в
ORDER BY
— это оптимальный выбор для таблиц, где запросы часто используют сортировку или фильтрацию по нескольким полям одновременно. Он также ускоряет выполнение диапазонных запросов. - Пропускающие индексы по каждому полю лучше подходят для ускорения запросов с фильтрацией по отдельным полям. Это более гибкий подход, если вы не уверены, какие поля будут использоваться в запросах.
Recommended Posts
clickhouse-go лучшие практики
16.04.2024