El motor pertenece a la familia de motores Log. Consulte las propiedades comunes de los motores Log y sus diferencias en el artículo Familia de motores Log.
Log se diferencia de TinyLog en que mantiene un pequeño archivo de “marcas” junto a los archivos de columna. Estas marcas se escriben en cada bloque de datos y contienen desplazamientos que indican dónde empezar a leer el archivo para omitir el número especificado de filas. Esto permite leer los datos de la tabla en varios hilos.
Para el acceso concurrente a los datos, las operaciones de lectura pueden realizarse simultáneamente, mientras que las operaciones de escritura bloquean tanto las lecturas como otras escrituras.
El motor Log no admite índices. Del mismo modo, si falla una escritura en la tabla, la tabla queda dañada y al leerla se devuelve un error. El motor Log es adecuado para datos temporales, tablas de escritura única y pruebas o fines de demostración.
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
Consulte la descripción detallada de la consulta CREATE TABLE.
El motor Log almacena los datos de forma eficiente escribiendo cada columna en su propio archivo. Para cada tabla, el motor Log escribe los siguientes archivos en la ruta de almacenamiento especificada:
<column>.bin: Un archivo de datos para cada columna, que contiene los datos serializados y comprimidos.
__marks.mrk: Un archivo de marcas que almacena desplazamientos y recuentos de filas para cada bloque de datos insertado. Las marcas se utilizan para facilitar una ejecución eficiente de las consultas, ya que permiten que el motor omita bloques de datos irrelevantes durante las lecturas.
Cuando se escriben datos en una tabla Log:
- Los datos se serializan y se comprimen en bloques.
- Para cada columna, los datos comprimidos se añaden a su archivo
<column>.bin correspondiente.
- Se añaden las entradas correspondientes al archivo
__marks.mrk para registrar el desplazamiento y el número de filas de los datos recién insertados.
El archivo de marcas permite a ClickHouse paralelizar la lectura de los datos. Esto significa que una consulta SELECT devuelve las filas en un orden impredecible. Use la cláusula ORDER BY para ordenar las filas.
Creación de una tabla:
CREATE TABLE log_table
(
timestamp DateTime,
message_type String,
message String
)
ENGINE = Log
Inserción de datos:
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')
Usamos dos consultas INSERT para crear dos bloques de datos dentro de los archivos <column>.bin.
ClickHouse usa varios hilos al seleccionar datos. Cada hilo lee un bloque de datos distinto y devuelve las filas resultantes de forma independiente a medida que finaliza. Como resultado, el orden de los bloques de filas en la salida puede no coincidir con el orden de esos mismos bloques en la entrada. Por ejemplo:
┌───────────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 │
└─────────────────────┴──────────────┴───────────────────────────┘
Ordenación de los resultados (en orden ascendente de forma predeterminada):
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 │
└─────────────────────┴──────────────┴────────────────────────────┘
Última modificación el 10 de junio de 2026