Partition:
Partition - это логическое (и физическое) разбиение таблицы по какому-то ключу. Чтобы его задать, мы используем при создании таблицы правило, с помощью:
PARTITION BY🪚
Например, PARTITION BY toYYYYMM(month), что означает, что данные будут храниться по месяцам - каждая партиция соответствует одному месяцу. Это про логику.
И физически каждая партиция хранится отдельно на диске.
Зачем это нужно:
• когда данные разбиты на файлики по ключевому полю, можно быстро удалять/заливать данные за конкретный период (например, DROP PARTITION🗑 не будет перебирать и фильтровать строки, он просто удалит выбранные партиции - то бишь соответствующие файлы)
• ну и запросы работают быстрее, если фильтр попадает в партицию (тогда ClickHouse не будет трогать остальные).
Чаще всего партиции делят по периодам времени📆, как было у нас в примере выше, но ключ может быть любым.
Part:
Part - это физический кусок данных, по сути - отдельный файлик.
Откуда берется?
Когда мы вставляем данные в таблицу, ClickHouse создаёт отдельный part(файлик). Потом движок MergeTree постепенно объединяет мелкие parts в более крупные (этот процесс называется merge).
👾Вот тут важный момент, в котором я раньше путалась: не понимала, почему внутри партиции может быть несколько parts, если партиция - это вроде как физическая единица. Но вот так вот - пока parts не сольются в один файл, внутри партиции может быть несколько parts.
С этим моментом, кстати, связано то, что в ClickHouse не стоит делать очень много мелких вставок (по строке, например). Потому что в таком случае придется выполнять merge слишком часто...🥲 Рекомендуется вставлять данные в ClickHouse пакетами, от 10 000 строк за раз🤝
Гранула (granule):
Гранула - это самая маленькая единица хранения в MergeTree. Это блок строк, которые ClickHouse может прочитать за раз.
Размер гранулы по умолчанию - 8192 строк (2 в 13 степени🐈). Но может быть изменен при создании таблицы (задаётся параметром).
Гранула - это логическая единица. Набор строк внутри гранулы не хранится в отдельном файле. Чтобы запомнить, где какая гранула, ClickHouse делает метки📌 и создает файл индекса, который хранит метки.
Зачем нужны гранулы:
Они позволяют эффективно работать с индексами: если фильтр не попадает в гранулу, то её можно целиком пропустить;
именно за счёт гранул достигается ускорение при чтении данных✈️
Что пригодится на практике:
• partition удобно использовать для крупных операций (удалить или перенести данные за месяц или год)🐈
• parts нужно контролировать, чтобы их не стало слишком много (иначе запросы и мёрджи замедлятся)🐈
• гранулы напрямую влияют на скорость выборки - чем лучше подобран первичный ключ, тем меньше лишних гранул будет прочитано🐈