Этот движок относится к семейству движков 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:
- Данные сериализуются и сжимаются в блоки.
- Для каждого столбца сжатые данные дописываются в соответствующий файл
<column>.bin. - В файл
__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','The first regular message')
INSERT INTO log_table VALUES (now(),'REGULAR','The second regular message'),(now(),'WARNING','The first warning message')Мы использовали два запроса INSERT, чтобы создать два блока данных внутри файлов <column>.bin.
ClickHouse использует несколько потоков при выборке данных. Каждый поток читает отдельный блок данных и по завершении независимо возвращает результирующие строки. В результате порядок блоков строк в выводе может не совпадать с порядком этих же блоков во входных данных. Например:
SELECT * FROM log_table┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2019-01-18 14:27:32 │ REGULAR │ The second regular message │
│ 2019-01-18 14:34:53 │ WARNING │ The first warning message │
└─────────────────────┴──────────────┴────────────────────────────┘
┌───────────timestamp─┬─message_type─┬─message───────────────────┐
│ 2019-01-18 14:23:43 │ REGULAR │ The first regular message │
└─────────────────────┴──────────────┴───────────────────────────┘Сортировка результатов (по умолчанию — по возрастанию):
SELECT * FROM log_table ORDER BY timestamp┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2019-01-18 14:23:43 │ REGULAR │ The first regular message │
│ 2019-01-18 14:27:32 │ REGULAR │ The second regular message │
│ 2019-01-18 14:34:53 │ WARNING │ The first warning message │
└─────────────────────┴──────────────┴────────────────────────────┘