Ключ сортировки помогает не читать лишние гранулы. Но у таблицы бывает и второй ключ, который делит её на крупные независимые куски. Он нужен не столько для скорости запросов, сколько для управления данными: как быстро выбросить старый месяц, как не сливать в одну кучу данные за годы.
Коробки по месяцам
Бухгалтерия хранит бумаги в коробках, по коробке на месяц. Нужен отчёт за июнь: открываешь одну коробку, остальные не трогаешь. Прошло пять лет, документы за старый месяц можно уничтожить: выносишь коробку целиком, не перебирая листы. А внутри коробки бумаги разложены по датам, это уже порядок сортировки.
Партиция в ClickHouse это такая коробка. Ключ партиционирования задают в CREATE TABLE словами PARTITION BY:
CREATE TABLE orders (...)
ENGINE = MergeTree
PARTITION BY toYYYYMM(created_at)
ORDER BY (zone_id, created_at);
toYYYYMM(created_at) превращает время заказа в число вида 202606. Все заказы июня попадут в партицию 202606, мая в 202605.
Что меняется в частях
Ты уже видел номер партиции в начале имени части: 202606_1_1_0. Теперь понятно, откуда он:
- одна вставка пишет по отдельной части в каждую партицию, которую задела. Вставка заказов за конец мая и начало июня создаст две части;
- части сливаются только внутри своей партиции. Июнь никогда не смешается с маем;
- для каждой части ClickHouse помнит минимум и максимум ключа партиции и колонок, из которых он вычислен. Поэтому запрос с условием на дату сразу отбрасывает лишние части. Это называют отсечением партиций.
урок из курса
Урок из курса «ClickHouse и аналитические базы». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.