В уроке про типы мы создали таблицу и мимоходом написали в конце ENGINE = MergeTree ORDER BY id. В PostgreSQL такой строчки нет: там все таблицы хранятся одинаково. В ClickHouse способ хранения выбирают для каждой таблицы, и от этого выбора зависит почти всё: как быстро идёт вставка, какие запросы будут быстрыми, что происходит с дублями.
Склад под задачу
Представь, что тебе нужно где-то хранить вещи. Коробку с бумагами на неделю можно поставить под стол. Архив документов за десять лет нужен шкаф с ящиками по годам. Склад интернет-магазина требует стеллажей, сортировки и погрузчика. Всё это хранение, но устроено оно по-разному, потому что задачи разные.
Движок таблицы в ClickHouse это и есть способ хранения. Его указывают при создании таблицы после слова ENGINE.
Простые движки
Memoryдержит данные в оперативной памяти. Быстро, но после перезапуска сервера таблица окажется пустой. Годится для временных справочников и экспериментов.LogиTinyLogпишут колонки в файлы и только дописывают. Ни индексов, ни сортировки. Подходят для маленьких таблиц, которые пишут один раз и читают целиком.
Ещё есть движки-обёртки, которые сами ничего не хранят: Distributed раскидывает запросы по серверам кластера, Kafka читает поток сообщений, S3 смотрит на файлы в облачном хранилище. До них дойдём в конце раздела.
А почти все настоящие таблицы в ClickHouse живут на движках семейства MergeTree.
MergeTree: части и слияния
Разберём, как MergeTree принимает данные. Каждая вставка INSERT пишется на диск отдельной частью (part): отдельной папкой со своими файлами колонок. Внутри части строки отсортированы по ключу из ORDER BY. Однажды записанная часть больше не меняется.
Вставка от этого очень дешёвая: не нужно искать место в существующих файлах, не нужно ничего перестраивать. Отсортировал пачку и записал рядом с остальными.
Но если каждая вставка оставляет часть, через день частей будут тысячи, и запросу придётся открывать каждую. Поэтому ClickHouse в фоне сливает части: берёт несколько маленьких и пишет из них одну большую. Части уже отсортированы, поэтому слить их легко. Представь две колоды карт, каждая разложена по порядку: чтобы получить одну упорядоченную колоду, достаточно каждый раз брать меньшую из двух верхних карт.
Отсюда и название: Merge Tree, дерево слияний. Маленькие части сливаются в средние, средние в большие.
урок из курса
Урок из курса «ClickHouse и аналитические базы». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.