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 — это значение по умолчанию.
Предыдущий раздел
Движки баз данных
Следующий раздел
ReplacingMergeTree
Была ли страница полезной?