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. другие движки

ХарактеристикаMergeTreeLog EngineMemory Engine
ХранениеПостоянное (диск)ПостоянноеТолько RAM
Скорость запросаБыстрая (отсортированная + индексированная)Медленная (без индекса)Очень быстрая (но временная)
Компрессия✅ Да❌ Нет❌ Нет
Слияние✅ Да (автоматическое)❌ Нет❌ Нет
Партиционирование✅ Да❌ Нет❌ Нет
Репликация✅ Да (с ReplicatedMergeTree)❌ Нет❌ Нет
Лучше всего дляБольшие наборы данных, аналитикаЛогирование в реальном времениВременные данные