Перейти к основному содержанию
Перейти к основному содержанию

Движок таблицы Log

Not supported in ClickHouse Cloud

Этот движок относится к семейству движков Log. Общие свойства движков Log и их различия см. в статье Семейство движков Log.

Log отличается от TinyLog тем, что рядом с файлами столбцов хранится небольшой файл «меток». Эти метки записываются для каждого блока данных и содержат смещения, которые указывают, откуда нужно начать чтение файла, чтобы пропустить заданное количество строк. Это позволяет читать данные таблицы в несколько потоков. Для параллельного доступа к данным операции чтения могут выполняться одновременно, при этом операции записи блокируют чтение и друг друга. Движок Log не поддерживает индексы. Аналогично, если запись в таблицу завершилась ошибкой, таблица считается повреждённой, и чтение из неё приводит к ошибке. Движок Log подходит для временных данных, таблиц с однократной записью, а также для тестирования или демонстрационных целей.

Создание таблицы

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    column1_name [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    column2_name [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = Log

См. подробное описание запроса CREATE TABLE.

Запись данных

Движок Log эффективно хранит данные, записывая каждый столбец в отдельный файл. Для каждой таблицы движок Log записывает следующие файлы в указанный путь хранения:

  • <column>.bin: файл данных для каждого столбца, содержащий сериализованные и сжатые данные. __marks.mrk: файл меток, в котором хранятся смещения и количество строк для каждого вставленного блока данных. Метки используются для эффективного выполнения запросов, позволяя движку пропускать нерелевантные блоки данных при чтении.

Процесс записи

Когда данные записываются в таблицу Log:

  1. Данные сериализуются и сжимаются в блоки.
  2. Для каждого столбца сжатые данные дописываются в соответствующий файл <column>.bin.
  3. В файл __marks.mrk добавляются соответствующие записи, фиксирующие смещение и количество строк вновь вставленных данных.

Чтение данных

Файл меток позволяет ClickHouse выполнять параллельное чтение данных. Это означает, что запрос SELECT может возвращать строки в непредсказуемом порядке. Используйте конструкцию ORDER BY, чтобы отсортировать строки.

Пример использования

Создание таблицы:

CREATE TABLE log_table
(
    timestamp DateTime,
    message_type String,
    message String
)
ENGINE = Log

Вставка данных:

INSERT INTO log_table VALUES (now(),'REGULAR','Первое обычное сообщение')
INSERT INTO log_table VALUES (now(),'REGULAR','Второе обычное сообщение'),(now(),'WARNING','Первое предупреждение')

Мы использовали два запроса INSERT, чтобы создать два блока данных внутри файлов <column>.bin.

ClickHouse использует несколько потоков при выборке данных. Каждый поток читает отдельный блок данных и по завершении независимо возвращает результирующие строки. В результате порядок блоков строк в выводе может не совпадать с порядком этих же блоков на входе. Например:

SELECT * FROM log_table
┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2019-01-18 14:27:32 │ REGULAR      │ Второе обычное сообщение │
│ 2019-01-18 14:34:53 │ WARNING      │ Первое предупреждение  │
└─────────────────────┴──────────────┴────────────────────────────┘
┌───────────timestamp─┬─message_type─┬─message───────────────────┐
│ 2019-01-18 14:23:43 │ REGULAR      │ Первое обычное сообщение │
└─────────────────────┴──────────────┴───────────────────────────┘

Сортировка результатов (по умолчанию — по возрастанию):

SELECT * FROM log_table ORDER BY timestamp
┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2019-01-18 14:23:43 │ REGULAR      │ Первое обычное сообщение   │
│ 2019-01-18 14:27:32 │ REGULAR      │ Второе обычное сообщение   │
│ 2019-01-18 14:34:53 │ WARNING      │ Первое предупреждение      │
└─────────────────────┴──────────────┴────────────────────────────┘