Log. Общие свойства движков Log и различия между ними см. в статье Семейство движков Log.
Log отличается от TinyLog тем, что рядом с файлами столбцов хранится небольшой файл «меток». Эти метки записываются для каждого блока данных и содержат смещения, указывающие, с какого места начинать чтение файла, чтобы пропустить заданное количество строк. Это позволяет читать данные таблицы в несколько потоков.
При одновременном доступе к данным операции чтения могут выполняться параллельно, тогда как операции записи блокируют и чтение, и друг друга.
Движок Log не поддерживает индексы. Кроме того, если при записи в таблицу произошёл сбой, таблица повреждается, и чтение из неё возвращает ошибку. Движок Log подходит для временных данных, таблиц с однократной записью, а также для тестирования и демонстрации.
Создание таблицы
Запись данных
Log эффективно хранит данные, записывая каждый столбец в отдельный файл. Для каждой таблицы движок Log записывает в указанный путь хранения следующие файлы:
<column>.bin: файл данных для каждого столбца, содержащий сериализованные и сжатые данные.__marks.mrk: файл меток, в котором хранятся смещения и количество строк для каждого вставленного блока данных. Метки используются для эффективного выполнения запросов, позволяя движку пропускать нерелевантные блоки данных при чтении.
Процесс записи
Log:
- Данные сериализуются и сжимаются в блоки.
- Для каждого столбца сжатые данные дописываются в соответствующий файл
<column>.bin. - В файл
__marks.mrkдобавляются соответствующие записи, фиксирующие смещение и количество строк для вновь вставленных данных.
Чтение данных
SELECT возвращает строки в непредсказуемом порядке. Используйте ORDER BY, чтобы отсортировать строки.
Пример использования
INSERT, чтобы создать два блока данных внутри файлов <column>.bin.
ClickHouse использует несколько потоков при выборке данных. Каждый поток читает отдельный блок данных и по завершении независимо возвращает результирующие строки. В результате порядок блоков строк в выводе может не совпадать с порядком этих же блоков во входных данных. Например: