Что такое ClickHouse, история создания, область применения, колоночная архитектура, векторизованное выполнение
Почему ClickHouse быстрее традиционных баз данных в 100-1000 раз для аналитических запросов
ClickHouse — это открытая колоночная OLAP-система (Online Analytical Processing), разработанная компанией Яндекс в 2016 году для сервиса Яндекс.Метрика. Сегодня проект развивается как open-source с активным сообществом и используется тысячами компаний по всему миру.
ClickHouse создан для аналитических запросов к большим объёмам данных:
✅ Хорошие use case:
❌ Плохие use case:
Традиционные строковые БД (PostgreSQL, MySQL) хранят данные по строкам:
Строка 1: | id=1 | name="Alice" | age=25 | city="Moscow" |
Строка 2: | id=2 | name="Bob" | age=30 | city="London" |
Строка 3: | id=3 | name="Carol" | age=28 | city="Paris" |
Для запроса SELECT AVG(age) FROM users нужно прочитать все колонки всех строк, даже если нужны только значения age.
Колоночные БД (ClickHouse) хранят данные по колонкам:
id: | 1 | 2 | 3 |
name: | Alice | Bob | Carol |
age: | 25 | 30 | 28 |
city: | Moscow | London | Paris |
Для того же запроса читается только колонка age — остальные игнорируются.
ClickHouse обрабатывает данные не по одной строке, а векторами (пакетами) по 64-128 значений:
# Вместо построчной обработки:
for row in rows:
result = row.age * 2 + 10
# ClickHouse использует векторные операции:
ages = [25, 30, 28, ...] # вектор из 64 значений
result = ages * 2 + 10 # одна SIMD-инструкция
Это позволяет использовать SIMD-инструкции процессора (SSE, AVX), которые выполняют одну операцию над несколькими значениями одновременно.
Результат: ускорение в 10-50 раз для вычислительных запросов.
┌─────────────────────────────────────────────────────────┐
│ ClickHouse Server │
├─────────────────────────────────────────────────────────┤
│ HTTP Interface (8123) │ Native Interface (9000) │
├─────────────────────────────────────────────────────────┤
│ SQL Parser & Optimizer │
├─────────────────────────────────────────────────────────┤
│ Query Executor │
│ (Vectorized, Pipeline-based) │
├─────────────────────────────────────────────────────────┤
│ Storage Engine Layer │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ MergeTree│ │ Log │ │ Memory │ │ Custom │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
├─────────────────────────────────────────────────────────┤
│ File System │
│ (Data Parts, Indexes, Logs) │
└─────────────────────────────────────────────────────────┘
ClickHouse поддерживает различные движки таблиц (table engines), определяющие способ хранения и обработки данных:
| Семейство | Назначение | Примеры |
|---|---|---|
| MergeTree | Основное семейство для аналитики | MergeTree, ReplacingMergeTree, SummingMergeTree |
| Log | Простые таблицы для временных данных | Log, StripeLog, TinyLog |
| Memory | Данные в оперативной памяти | Memory, Set, Join |
| Интеграция | Работа с внешними источниками | MySQL, PostgreSQL, Kafka, HDFS |
| Специальные | Узкоспециализированные задачи | Null, File, URL, Dictionary |
MergeTree — основной движок для production. Остальные используются для специфических сценариев.
Читаем только нужные колонки — экономия I/O в 10-100 раз.
Используем специализированные кодеки:
SIMD-инструкции процессора для параллельной обработки.
Первичный индекс и вторичные индексы позволяют пропускать до 99% данных при чтении.
Автоматическое использование всех ядер CPU для выполнения запроса.
Данные хранятся отсортированными, что обеспечивает последовательное чтение с диска.
Запрос: SELECT COUNT(DISTINCT user_id) FROM events WHERE date = '2026-03-01'
| Система | Время выполнения |
|---|---|
| PostgreSQL | 45 секунд |
| MySQL | 60 секунд |
| ClickHouse | 0.3 секунды |
Ускорение: 150-200 раз.
В следующей теме установим ClickHouse через Docker и выполним первые запросы.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.