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

Движки таблиц и семейство MergeTree

junior~15 мин

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

В уроке про типы мы создали таблицу и мимоходом написали в конце 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 ₽.

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