Что такое ClickHouse

Коротко

ClickHouse — open-source колоночная БД для аналитики (OLAP). Создана в Яндексе. Используется в:

  • Яндекс.Метрика (исходно).
  • Cloudflare, Uber, Сбер, Авито.
  • Большинство российских стартапов и enterprise.

Зачем: обрабатывать миллиарды строк за секунды.

Колоночное хранение

В обычной БД (PostgreSQL) данные хранятся построчно:

Row 1: [id=1, name='A', amount=100, date='2026-04-01']
Row 2: [id=2, name='B', amount=200, date='2026-04-01']

В ClickHouse — по колонкам:

id:     [1, 2, 3, 4, ...]
name:   ['A', 'B', 'C', 'D', ...]
amount: [100, 200, 150, 80, ...]
date:   ['2026-04-01', '2026-04-01', ...]

Преимущества

  • Быстрая агрегация — для SUM(amount) читаем только колонку amount.
  • Лучшее сжатие — повторяющиеся значения в колонке.
  • Меньше I/O — не читаем ненужные колонки.

Недостатки

  • Медленные UPDATE / DELETE (нужно перезаписывать колонку).
  • Плохо для OLTP (одиночные строки).

Когда ClickHouse vs PostgreSQL

PostgreSQL (OLTP)

  • Транзакции, заказы, регистрации.
  • Часто INSERT / UPDATE / DELETE.
  • 10M строк или меньше.

ClickHouse (OLAP)

  • Аналитика, дашборды, агрегаты.
  • Преимущественно SELECT.
  • 100M+ строк, миллиарды.

Подробнее.

Особенности SQL

ClickHouse использует SQL, но с расширениями:

Функции

-- Агрегаты
uniq(user_id)         -- approximate DISTINCT count(быстро)
uniqExact(user_id)    -- точный (медленнее)
quantile(0.95)(x)     -- approximate percentile

-- Дата
toStartOfMonth(DATE)  -- начало месяца
toMonday(DATE)         -- понедельник недели
toYYYYMM(DATE)         -- 202604

Массивы (native!)

SELECT
    user_id,
    arrayDistinct(groupArray(product_id)) AS unique_products,
    length(arrayDistinct(groupArray(product_id))) AS unique_count
FROM orders
GROUP BY user_id;

ARRAY JOIN

-- Развернуть массив в строки (как unnest в Postgres)
SELECT user_id, tag
FROM users
ARRAY JOIN tags AS tag;

MergeTree — основной engine

ClickHouse использует разные engines для таблиц. Самый частый — MergeTree:

CREATE TABLE events (
    user_id UInt64,
    event_time DateTime,
    event_name String,
    value Float64
) ENGINE = MergeTree()
ORDER BY (user_id, event_time)
PARTITION BY toYYYYMM(event_time);
  • ORDER BY — primary index, главное для performance.
  • PARTITION BY — физическое разбиение (обычно по месяцу).

Если хочется сразу закрепить тему на практике — открой тренажёр в Telegram. 10 минут в день — и синтаксис в пальцах.

Производительность

Типичные числа (на 1 сервере):

  • Insert: 1M+ rows/sec.
  • Select агрегатов на миллиардах строк: 1–5 секунд.
  • Запросы COUNT(*) в реальном времени.

Сравнение (грубо, для агрегата на 100M строк):

  • PostgreSQL: 30–60 секунд.
  • ClickHouse: 0.5–2 секунды.

Как использовать

Через clickhouse-client

clickhouse-client --query "SELECT COUNT(*) FROM events"

Через DBeaver / DataGrip

Стандартные SQL-клиенты поддерживают.

Через Python

from clickhouse_driver import Client

client = Client('localhost')
result = client.execute('SELECT * FROM events LIMIT 10')

Особенности для аналитика

Approximate aggregates

-- Точно (медленно)
SELECT count(DISTINCT user_id) FROM events

-- Приближённо (быстро, ошибка < 1%)
SELECT uniq(user_id) FROM events

Для дашбордов approximate всегда достаточен.

Sampling

SELECT * FROM events SAMPLE 0.1
-- 10% от данных, для быстрого изучения

Materialized Views

ClickHouse автоматически обновляет:

CREATE MATERIALIZED VIEW daily_stats
ENGINE = AggregatingMergeTree() ORDER BY day AS
SELECT toDate(event_time) AS day, count() AS events_cnt
FROM events GROUP BY day;

Что не умеет

  • Полноценные транзакции (нет ACID на уровне множественных таблиц).
  • JOIN на больших данных работает, но медленнее, чем GROUP BY.
  • Constraints (FK, complex unique).

Стек ClickHouse в компании

Backend (PostgreSQL — транзакции)
        ↓ ETL (Airflow)
ClickHouse (аналитика)
        ↓
BI (Tableau, DataLens, Superset)

Стандартная архитектура data-driven компании.

Чтобы не только читать теорию, но и решать реальные задачи — загляните в бот Карьерника. Там по каждой теме подборка вопросов с разборами.

Cloud

  • ClickHouse Cloud — managed.
  • Yandex Cloud — managed ClickHouse.
  • Altinity Cloud — независимый managed.

Нужно ли аналитику

В РФ — да

ClickHouse — стандарт у Авито, Wildberries, Тинькофф, Ozon, Яндекса.

Для middle+

Базовое знание ClickHouse — обязательно. SQL похож, но нюансы есть.

Для junior

Достаточно знать, что есть. Глубоко учить — после оффера.

Как выучить

  • 1–2 дня: основы SQL отличий.
  • 1 неделя: arrays, materialized views.
  • Месяц: глубокая оптимизация (partitioning, ORDER BY).

Документация ClickHouse — отличная, на русском есть.

Читайте также

FAQ

ClickHouse бесплатный?

Open-source да. Cloud — платный.

Подходит ли для real-time?

Да. Insert latency низкий, читать можно почти сразу.

MySQL vs ClickHouse?

MySQL — OLTP. ClickHouse — OLAP. Совершенно разные задачи.

Сложно ли учить?

SQL базовый — нет. Особенности (engines, materialized views, performance) — несколько недель.