MergeTree
Движок MergeTree, а также другие движки этого семейства — это наиболее функциональные движки таблиц ADQM.
Основная идея, заложенная в основу движков семейства MergeTree следующая: при наличии больших объемов данных, которые должны быть вставлены в таблицу, данные с большой скоростью записываютя по частям. Эти части затем объединяются по некоторым правилам в фоновом режиме. Этот метод намного эффективнее, чем постоянная перезапись данных в хранилище при вставке.
Основные возможности:
- хранение данных, отсортированных по первичному ключу. Это позволяет создавать разреженный индекс небольшого объема, который позволяет быстрее находить данные;
- операции с партициями, если задан ключ партиционирования. ADQM поддерживает отдельные операции с партициями, которые работают эффективнее, чем общие операции с этим же результатом над этими же данными. Также ADQM автоматически отсекает данные по партициям там, где ключ партиционирования указан в запросе, что увеличивает эффективность выполнения запросов;
- поддержка репликации данных. Для этого используется семейство таблиц ReplicatedMergeTree;
- сэмплирование данных. При необходимости можно задать способ сэмплирования данных в таблице.
Создание таблицыCREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], ... INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1, INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2 ) ENGINE = MergeTree() ORDER BY expr [PARTITION BY expr] [PRIMARY KEY expr] [SAMPLE BY expr] [TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx' [, ...] ] [WHERE conditions] [GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ] ] [SETTINGS name=value, ...]
Секции запроса:
ENGINE
— имя и параметры движка.ENGINE
=MergeTree
().MergeTree
не имеет параметров;ORDER BY
— ключ сортировки;- кортеж столбцов или произвольных выражений. Пример:
ORDER BY
(CounterID
,EventDate
); - ADQM использует ключ сортировки в качестве первичного ключа, если первичный ключ не задан в секции
PRIMARY KEY
; - синтаксис
ORDER BY tuple()
используйте, чтобы отключить сортировку. Смотрите выбор первичного ключа; PARTITION BY
— ключ партиционирования. Необязательный параметр;- выражение
toYYYYMM(date_column)
используйте для партиционирования по месяцам, гдеdate_column
— столбец с датой типаDate
. В этом случае имена партиций имеют формат "YYYYMM"; PRIMARY KEY
— первичный ключ, если он отличается от ключа сортировки. Необязательный параметр;- первичный ключ, по умолчанию совпадает с ключом сортировки (который задаётся секцией
ORDER BY
.) Поэтому в большинстве случаев секциюPRIMARY KEY
отдельно указывать не нужно; SAMPLE BY
— выражение для сэмплирования. Необязательный параметр;- первичный ключ должен содержать выражение для сэмплирования, если оно используется. Результат выражения для сэмплирования должен быть беззнаковым целым числом. Пример:
SAMPLE BY intHash32(UserID) ORDER BY
(CounterID
,EventDate
,intHash32(UserID)
); TTL
— список правил, определяющих длительности хранения строк, а также задающих правила перемещения частей на определённые тома или диски. Необязательный параметр.- выражение должно возвращать столбец
Date
илиDateTime
. Пример:TTL date + INTERVAL 1 DAY
; - тип правила
DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'|GROUP BY
указывает на действие, которое будет выполнено с частью: удаление строк (прореживание), перемещение (при выполнении условия для всех строк части) на определённый диск (TO DISK 'xxx'
) или том (TO VOLUME 'xxx'
), или агрегирование данных в устаревших строках. Поведение по умолчанию соответствует удалению строк (DELETE
). В списке правил может быть указано только одно выражение с поведениемDELETE
.
Например:
ENGINE MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity=8192
В примере установлено партиционирование по месяцам.
Также задано выражение для сэмплирования в виде хэша по идентификатору посетителя. Это позволяет псевдослучайным образом перемешать данные в таблице для каждого
CounterID
и EventDate
. Если при выборке данных задать секцию SAMPLE
, то ADQM вернёт равномерно-псевдослучайную выборку данных для подмножества посетителей.Указание
index_granularity
, поскольку 8192 — это значение по умолчанию.