ClickHouse: ORDER BY, несколько полей составного индекса или индексы по каждому полю в отдельности?
В ClickHouse, когда в выражении ORDER BY
указано несколько полей, это приводит к созданию составного индекса, а не отдельных индексов по каждому полю.
Как это работает?
Когда вы указываете несколько полей в ORDER BY
, ClickHouse использует их для сортировки данных в таблице. Это не означает, что для каждого поля будет создан отдельный индекс. Вместо этого создаётся единый составной индекс на основе всех этих полей. Такой индекс эффективно ускоряет запросы, которые фильтруют и сортируют данные по этим полям.
Пример
1 2 3 4 5 6 7 8 9 |
CREATE TABLE example_table ( id UInt64, name String, created_at DateTime, amount Float32 ) ENGINE = MergeTree() ORDER BY (created_at, id); |
Объяснение:
- В данном примере, индексация будет создана на основе двух полей:
created_at
иid
. - Составной индекс будет учитывать оба поля в порядке их указания в
ORDER BY
(сначала поcreated_at
, потом поid
). - Это означает, что ClickHouse будет эффективно использовать этот индекс для запросов, которые фильтруют по
created_at
или по комбинацииcreated_at
иid
.
Как ClickHouse работает с составным индексом?
- Сортировка по полям:
- При записи данных ClickHouse будет поддерживать сортировку на основе значений полей
created_at
иid
в том порядке, в котором они указаны вORDER BY
.
- При записи данных ClickHouse будет поддерживать сортировку на основе значений полей
- Поиск по индексам:
- Когда вы выполняете запрос, фильтрующий данные по
created_at
илиid
, ClickHouse использует составной индекс для эффективного поиска. - Если запрос включает оба поля (например,
WHERE created_at > '2025-01-01' AND id < 100
), составной индекс будет использоваться оптимально.
- Когда вы выполняете запрос, фильтрующий данные по
Важные моменты:
- Поле, указанное первым в
ORDER BY
(например,created_at
): Это поле будет иметь наибольшее значение при поиске, и его значение будет в первую очередь использоваться при индексации. - Поле, указанное вторым (например,
id
): Это поле будет использоваться для более точной фильтрации внутри диапазона значений первого поля.
Пример запроса, который использует составной индекс:
1 2 3 4 |
SELECT * FROM example_table WHERE created_at >= '2025-01-01' ORDER BY created_at, id; |
created_at
и затем по полю id
, поскольку оба этих поля входят в составной индекс.
Итог:
Когда вы указываете несколько полей в ORDER BY
, в ClickHouse создаётся составной индекс на эти поля, который позволяет эффективно фильтровать и сортировать данные по ним.
Recommended Posts
clickhouse-go лучшие практики
16.04.2024