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 в вопросах и ответах
28.04.2024
