Раздел 38 · ClickHouse и аналитические базы

Партиционирование данных

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Ключ сортировки помогает не читать лишние гранулы. Но у таблицы бывает и второй ключ, который делит её на крупные независимые куски. Он нужен не столько для скорости запросов, сколько для управления данными: как быстро выбросить старый месяц, как не сливать в одну кучу данные за годы.

Коробки по месяцам

Бухгалтерия хранит бумаги в коробках, по коробке на месяц. Нужен отчёт за июнь: открываешь одну коробку, остальные не трогаешь. Прошло пять лет, документы за старый месяц можно уничтожить: выносишь коробку целиком, не перебирая листы. А внутри коробки бумаги разложены по датам, это уже порядок сортировки.

Партиция в 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 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.