Движки таблиц
Движок таблицы в ADQM/ClickHouse — это тип таблицы, который определяет:
- 
место и способ хранения данных; 
- 
поддерживаемые запросы; 
- 
конкурентный доступ к данным; 
- 
возможность использования индексов; 
- 
возможность многопоточного выполнения запроса; 
- 
параметры репликации данных. 
Семейства движков таблиц
ADQM/ClickHouse поддерживает множество движков таблиц, которые оптимизированы для решения различных задач. Все движки разбиты на семейства (группы):
- 
MergeTree — наиболее универсальные и функциональные движки таблиц для хранения больших данных и высокопроизводительного поиска. Основное свойство этих движков — быстрая вставка данных с последующей фоновой обработкой. Подробнее в разделе Семейство MergeTree ниже. 
- 
Log — простые движки для сценариев, когда необходимо быстро записывать и затем целиком читать множество небольших таблиц (до 1 миллиона строк). 
- 
Интеграционные — семейство движков для доступа к внешним системам хранения данных (ODBC, JDBC, MySQL, MongoDB, HDFS, S3, Kafka, EmbeddedRocksDB, RabbitMQ, PostgreSQL). Подробную информацию об этих движках и примеры их использования можно получить в разделе Table Engines for Integrations документации ClickHouse. 
- 
Специальные — семейство движков для специальных задач, например: - 
Distributed — движок для распределенной обработки запросов на нескольких серверах (подробнее о создании и использовании таблиц типа Distributed в статье Шардирование). 
- 
Dictionary — движок, который отображает данные словаря как таблицу. 
- 
Merge (не путать с движком MergeTree) — движок, который позволяет читать данные одновременно из произвольного количества других таблиц. Таблица Merge не хранит данные самостоятельно, и запись в такую таблицу не поддерживается. 
- 
Другие движки — подробнее в разделе Special Table Engines документации ClickHouse. 
 
- 
Получить информацию о функциональных возможностях движков таблиц можно с помощью системной таблицы system.table_engines, например:
SELECT * FROM system.table_engines WHERE name in ('MergeTree', 'TinyLog', 'MySQL');Результат выполнения запроса:
--name--------supports_settings---supports_skipping_indices---supports_projections---supports_sort_order---supports_ttl---supports_replication---supports_deduplication---supports_parallel_insert-- │ MySQL │ 1 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ │ MergeTree │ 1 │ 1 │ 1 │ 1 │ 1 │ 0 │ 0 │ 1 │ │ TinyLog │ 1 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Семейство MergeTree
Особенности таблиц семейства MergeTree
MergeTree — основной движок таблиц для работы с большими данными в ADQM. Этот движок, а также все его специальные версии, поддерживают:
- 
партиционирование, то есть объединение данных таблицы в партиции (наборы записей, которыми можно гибко оперировать — отсоединять/присоединять, переносить и т.д.) по какому-либо критерию (например, по месяцу/дню/типу события); 
- 
репликацию данных; 
- 
семплирование данных; 
- 
оптимизированный поиск при помощи разреженного индекса по первичному ключу. 
Вставка и хранение данных
Особенности хранения данных в таблицах семейства MergeTree:
- 
При вставке данные записываются не единым целым, а в виде отдельных частей — кусков (data parts). Затем куски поэтапно объединяются между собой в фоновом режиме. 
- 
Данные в каждом куске отсортированы по первичному ключу. 
- 
Данные, относящиеся к разным партициям, разбиваются на разные куски. Куски разных партиций не сливаются между собой. 
- 
Процесс слияния данных управляется системой (система стремится к состоянию, когда каждая партиция содержит всего один отсортированный кусок данных), но его можно форсировать с помощью команды OPTIMIZE. 
- 
Каждый кусок данных логически делится на гранулы. Гранула — это минимальный неделимый набор данных, который считывается при выборке данных. Размер гранул задается настройками движка index_granularity(максимальное количество строк данных в грануле) иindex_granularity_bytes(максимальный размер гранулы в байтах).
- 
Каждый кусок хранится в отдельной директории внутри директории таблицы. Куски данных могут храниться как в колоночном формате (каждый столбец хранится в отдельном файле), так и в компактном (все столбцы хранятся в одном файле). 
- 
В конкретный момент времени в таблице может храниться более одной копии данных — неслитые между собой куски и их объединенный вариант. 
- 
Старые куски, данные которых были слиты в новый, постепенно удаляются. Время хранения неактивных кусков задает табличная настройка old_parts_lifetime.
- 
Кусками можно манипулировать как партициями (например, доступны операции перемещения, отсоединения и другие). 
Специальные версии движка MergeTree
Семейство MergeTree включает также следующие движки таблиц, которые наследуют функциональность MergeTree, но имеют некоторые особенности:
- 
ReplacingMergeTree — удаляет дублирующиеся записи с одинаковым значением ключа сортировки. Подходит для фоновой чистки дублирующихся данных в целях экономии места, но не дает гарантии отсутствия дубликатов. 
- 
SummingMergeTree — при слиянии кусков данных все строки с одинаковым ключом сортировки заменяются на одну, которая хранит суммы значений столбцов с числовым типом данных. 
- 
AggregatingMergeTree — используется для создания материализованных представлений (materialized views). 
- 
CollapsingMergeTree и VersionedCollapsingMergeTree — добавляют в алгоритм слияния кусков данных логику сворачивания (удаления) строк. 
- 
GraphiteMergeTree — движок для прореживания и агрегирования/усреднения данных Graphite. 
Движки реплицируемых таблиц
Для создания реплицируемых таблиц используются движки семейства MergeTree с префиксом Replicated:
- 
ReplicatedMergeTree 
- 
ReplicatedReplacingMergeTree 
- 
ReplicatedSummingMergeTree 
- 
ReplicatedAggregatingMergeTree 
- 
ReplicatedCollapsingMergeTree 
- 
ReplicatedVersionedCollapsingMergeTree 
- 
ReplicatedGraphiteMergeTree 
Пример использования движка ReplicatedMergeTree для создания реплицируемых таблиц можно посмотреть в статье Типовой кластер.