ClickHouse имеет много различных движков таблиц, но MergeTree является стандартным выбором благодаря следующим преимуществам:
✅ 1. Быстрые запросы на больших данных
- Отсортированное хранение + разреженный первичный индекс → Обеспечивает быструю фильтрацию, агрегацию и поиск.
- Эффективные запросы по диапазону → Запросы типа
WHERE timestamp >= '2024-01-01'
выполняются крайне быстро.
✅ 2. Обработка данных с высокой скоростью записи
- Пакетные вставки выполняются очень эффективно, поддерживая миллионы строк в секунду.
- В отличие от традиционных баз данных, ClickHouse избегает обновлений построчно.
✅ 3. Автоматическая оптимизация данных (слияние)
- Данные хранятся кусками, но ClickHouse периодически объединяет их в большие оптимизированные куски.
- Это снижает фрагментацию и ускоряет выполнение запросов с течением времени.
✅ 4. Поддержка партиционирования для ускорения запросов
- Партиции эффективно сокращают объем данных для чтения, что означает, что ClickHouse сканирует только соответствующие партиции.
- Пример: Если данные разделены по месяцам, запрос для января пропустит 11/12 данных.
✅ 5. Масштабируемость через репликацию и шардирование
- MergeTree поддерживает ReplicatedMergeTree для автоматического переключения при сбоях.
- Работает с движком Distributed для горизонтального масштабирования на нескольких узлах.
4. Пример: Создание таблицы MergeTree
Этот пример создает партиционированную и индексированную таблицу MergeTree, оптимизированную для аналитики.
CREATE TABLE sales (
id UInt32,
event_time DateTime,
product_id UInt32,
amount Float32
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(event_time) -- Данные разделены по месяцам
ORDER BY (event_time, id) -- Первичный индекс по event_time и id
SAMPLE BY id -- Поддержка выборки для быстрых приближенных запросов
TTL event_time + INTERVAL 1 YEAR; -- Автоматическое удаление данных через 1 год
Как это работает:
MergeTree()
→ Используется движок MergeTree.PARTITION BY toYYYYMM(event_time)
→ Каждый месяц получает свою партицию, что улучшает скорость запросов.ORDER BY (event_time, id)
→ Оптимизировано для запросов по диапазону поevent_time
.SAMPLE BY id
→ Обеспечивает приближенные запросы для быстрой аналитики.TTL event_time + INTERVAL 1 YEAR
→ Автоматическое удаление старых данных.
5. Варианты MergeTree
Название движка | Описание |
---|---|
MergeTree | Стандартный MergeTree, оптимизирован для быстрых чтений. |
ReplicatedMergeTree | Поддерживает репликацию для высокой доступности. |
SummingMergeTree | Предварительно агрегирует данные (суммирует числовые столбцы). |
AggregatingMergeTree | Хранит предварительно агрегированные состояния (используется для материализованных представлений). |
ReplacingMergeTree | Удаляет дублирующиеся строки на основе ключа дедубликации. |
CollapsingMergeTree | Поддерживает логическое объединение записей (например, состояния “начало” и “конец”). |
VersionedCollapsingMergeTree | Отслеживает версии событий, полезно для обработки журналов изменений. |
6. MergeTree vs. другие движки
Характеристика | MergeTree | Log Engine | Memory Engine |
---|---|---|---|
Хранение | Постоянное (диск) | Постоянное | Только RAM |
Скорость запроса | Быстрая (отсортированная + индексированная) | Медленная (без индекса) | Очень быстрая (но временная) |
Компрессия | ✅ Да | ❌ Нет | ❌ Нет |
Слияние | ✅ Да (автоматическое) | ❌ Нет | ❌ Нет |
Партиционирование | ✅ Да | ❌ Нет | ❌ Нет |
Репликация | ✅ Да (с ReplicatedMergeTree) | ❌ Нет | ❌ Нет |
Лучше всего для | Большие наборы данных, аналитика | Логирование в реальном времени | Временные данные |