Motor de mesa ClickHouse (dos) Serie Log

El motor de registro se desarrolló para escenarios en los que es necesario escribir muchas tablas con una pequeña cantidad de datos (menos de un millón de filas). El escenario de consulta de datos al que se enfrenta también es relativamente simple y, a menudo, se escribe en varias consultas a la vez, el motor de tabla de la serie de familias de registros será una buena opción.

Puntos comunes: Los
datos se almacenan en el disco. Si es un sistema Linux, se utiliza E / S directa.
Los datos se añaden al final del archivo al escribir.
No admite operaciones de mutación, es decir, no admite operaciones de actualización y eliminación.
Los índices no son compatibles.

Esto significa que SELECTen el rango de consulta la eficiencia no es alta.
Escribe datos de forma no atómica.
Si algo interrumpe la operación de escritura, como un apagado anormal del servidor, obtendrá una tabla que contiene datos corruptos.


Soporte de motor de registro diferenciado y StripeLog

Bloqueos para acceso concurrente a datos.
INSERTLa tabla se bloqueará durante la ejecución de la solicitud, y otras solicitudes de lectura y escritura de datos esperarán hasta que se libere el bloqueo. Si no hay una solicitud para escribir datos, se puede ejecutar cualquier cantidad de solicitudes de lectura al mismo tiempo.
Leer datos en paralelo.
Al leer datos, ClickHouse utiliza varios subprocesos. Cada hilo procesa un bloque de datos diferente.
Rendimiento de menor a mayor: TinyLog -> StripeLog -> Log

Resumen
TinyLog: no admite la lectura simultánea de archivos de datos y el rendimiento de la consulta es deficiente; el formato es simple y adecuado para el almacenamiento temporal de datos intermedios.
StripLog: admite la lectura simultánea de archivos de datos y el rendimiento de la consulta es mejor que TinyLog; todas las columnas se almacenan en el mismo archivo grande, lo que reduce la cantidad de archivos.
Registro: admite la lectura simultánea de archivos de datos y el rendimiento de la consulta es mejor que TinyLog; cada columna se almacenará en un archivo separado.

Motor de registro

#创建测试库、表
CREATE DATABASE test;
use test;

create table tb_test_Log(`id` Int64,`vipId` Int64,`brandId` Int32,`shopId` Int32, `saleDate` Datetime64,saleMoney Float32) engine = Log;
#查看表目录,但表目录是空的
[clickhouse@worker1 ~]$ ll /var/lib/clickhouse/data/test/
total 0
drwxr-x---. 2 clickhouse clickhouse   6 Mar 18 15:52 tb_test_Log
drwxr-x---. 2 clickhouse clickhouse  57 Mar 18 15:47 tb_test_StripeLog
drwxr-x---. 2 clickhouse clickhouse 133 Mar 18 15:38 tb_test_TinyLog
[clickhouse@worker1 ~]$ ll /var/lib/clickhouse/data/test/tb_test_Log/
total 0
#插入数据
insert into tb_test_Log values (10001,8001,429,6001,'2020-10-01 14:15:23',200.50);


SELECT *
FROM tb_test_Log

┌────id─┬─vipId─┬─brandId─┬─shopId─┬────────────────saleDate─┬─saleMoney─┐
│ 10001800142960012020-10-01 14:15:23.000200.5 │
└───────┴───────┴─────────┴────────┴─────────────────────────┴───────────┘

[clickhouse@worker1 ~]$ ll /var/lib/clickhouse/data/test/tb_test_Log/
total 32
-rw-r-----. 1 clickhouse clickhouse  30 Mar 18 15:54 brandId.bin
-rw-r-----. 1 clickhouse clickhouse  34 Mar 18 15:54 id.bin
-rw-r-----. 1 clickhouse clickhouse  96 Mar 18 15:54 __marks.mrk
-rw-r-----. 1 clickhouse clickhouse  34 Mar 18 15:54 saleDate.bin
-rw-r-----. 1 clickhouse clickhouse  30 Mar 18 15:54 saleMoney.bin
-rw-r-----. 1 clickhouse clickhouse  30 Mar 18 15:54 shopId.bin
-rw-r-----. 1 clickhouse clickhouse 217 Mar 18 15:54 sizes.json
-rw-r-----. 1 clickhouse clickhouse  34 Mar 18 15:54 vipId.bin

El motor de mesa de troncos es el motor de mesa de mayor rendimiento de la serie de familias de troncos.

La estructura de almacenamiento del motor de la tabla de registro se compone de tres partes:
[Columnas] archivo de datos .bin, el archivo de datos se almacena de forma independiente de acuerdo con la columna y cada campo de columna tiene un archivo bin correspondiente.

_marks.mrk: archivo de marca de datos, que guarda uniformemente la información de ubicación de los datos en cada archivo .bin de [columna]. Usando marcas de datos, se pueden usar varios subprocesos para leer los bloques de datos comprimidos en el archivo bin de manera paralela, mejorando así el rendimiento de la consulta de datos.

size.json: archivo de metadatos, que registra el tamaño de [columna] .bin y _marks.mrk.

Log tiene la función de marcado de datos y almacenamiento independiente de datos en cada columna. Puede admitir consultas paralelas y leer datos por columna, pero también requiere más descriptores de archivo, en comparación con StripeLog.

insert into tb_test_Log values (10002,8002,429,6001,'2020-10-02 14:15:23',300.50),(10003,8001,429,6001,'2020-10-02 14:15:23',100.50);


select * from tb_test_Log;

┌────id─┬─vipId─┬─brandId─┬─shopId─┬────────────────saleDate─┬─saleMoney─┐
│ 10002800242960012020-10-02 14:15:23.000300.5 │
│ 10003800142960012020-10-02 14:15:23.000100.5 │
└───────┴───────┴─────────┴────────┴─────────────────────────┴───────────┘
┌────id─┬─vipId─┬─brandId─┬─shopId─┬────────────────saleDate─┬─saleMoney─┐
│ 10001800142960012020-10-01 14:15:23.000200.5 │
└───────┴───────┴─────────┴────────┴─────────────────────────┴───────────┘

```sql
[clickhouse@worker1 ~]$ ll /var/lib/clickhouse/data/test/tb_test_Log/
total 32
-rw-r-----. 1 clickhouse clickhouse  64 Mar 18 15:58 brandId.bin
-rw-r-----. 1 clickhouse clickhouse  74 Mar 18 15:58 id.bin
-rw-r-----. 1 clickhouse clickhouse 192 Mar 18 15:58 __marks.mrk
-rw-r-----. 1 clickhouse clickhouse  77 Mar 18 15:58 saleDate.bin
-rw-r-----. 1 clickhouse clickhouse  64 Mar 18 15:58 saleMoney.bin
-rw-r-----. 1 clickhouse clickhouse  64 Mar 18 15:58 shopId.bin
-rw-r-----. 1 clickhouse clickhouse 218 Mar 18 15:58 sizes.json
-rw-r-----. 1 clickhouse clickhouse  74 Mar 18 15:58 vipId.bin

Se puede ver que los datos insertados más tarde se adjuntan al final de cada archivo de campo. No se agregarán archivos nuevos.

Motor TinyLog

# 建表 

CREATE TABLE tb_test_TinyLog
(
    `id` Int64, 
    `vipId` Int64, 
    `brandId` Int32, 
    `shopId` Int32, 
    `saleDate` Datetime64, 
    `saleMoney` Float32
)
ENGINE = TinyLog
#查看表目录,但表目录是空的
[clickhouse@worker1 ~]$ ll /var/lib/clickhouse/data/test/
total 0
drwxr-x---. 2 clickhouse clickhouse 6 Mar 18 15:28 tb_test_TinyLog
[clickhouse@worker1 ~]$ ll /var/lib/clickhouse/data/test/tb_test_TinyLog/
total 0
#插入数据
insert into tb_test_TinyLog values (10001,8001,429,6001,'2021-03-18 14:15:23',200.50);

SELECT * FROM tb_test_TinyLog

┌────id─┬─vipId─┬─brandId─┬─shopId─┬────────────────saleDate─┬─saleMoney─┐
│ 10001800142960012021-03-18 14:15:23.000200.5 │
└───────┴───────┴─────────┴────────┴─────────────────────────┴───────────┘
[clickhouse@worker1 ~]$ ll /var/lib/clickhouse/data/test/tb_test_TinyLog/
total 28
-rw-r-----. 1 clickhouse clickhouse  30 Mar 18 15:31 brandId.bin
-rw-r-----. 1 clickhouse clickhouse  34 Mar 18 15:31 id.bin
-rw-r-----. 1 clickhouse clickhouse  34 Mar 18 15:31 saleDate.bin
-rw-r-----. 1 clickhouse clickhouse  30 Mar 18 15:31 saleMoney.bin
-rw-r-----. 1 clickhouse clickhouse  30 Mar 18 15:31 shopId.bin
-rw-r-----. 1 clickhouse clickhouse 187 Mar 18 15:31 sizes.json
-rw-r-----. 1 clickhouse clickhouse  34 Mar 18 15:31 vipId.bin

[clickhouse@worker1 ~]$ cat  /var/lib/clickhouse/data/test/tb_test_TinyLog/sizes.json 
{
   
   "yandex":{
   
   "brandId%2Ebin":{
   
   "size":"30"},"id%2Ebin":{
   
   "size":"34"},"saleDate%2Ebin":{
   
   "size":"34"},"saleMoney%2Ebin":{
   
   "size":"30"},"shopId%2Ebin":{
   
   "size":"30"},"vipId%2Ebin":{
   
   "size":"34"}}}

Se puede ver que hay un archivo .bin comprimido para cada campo, y el tamaño de inicio .json es un metaarchivo que registra el tamaño del archivo .bin correspondiente a cada campo.


```sql
#继续插入数据
insert into tb_test_TinyLog values (10002,8002,429,6001,'2021-03-18 14:18:23',300.50),(10003,8003,429,6001,'2021-03-18 14:18:23',400.50);

 select * from tb_test_TinyLog;
┌────id─┬─vipId─┬─brandId─┬─shopId─┬────────────────saleDate─┬─saleMoney─┐
│ 10001800142960012021-03-18 14:15:23.000200.5 │
│ 10002800242960012021-03-18 14:18:23.000300.5 │
│ 10003800342960012021-03-18 14:18:23.000400.5 │
└───────┴───────┴─────────┴────────┴─────────────────────────┴───────────┘

```sql
[clickhouse@worker1 ~]$ ll /var/lib/clickhouse/data/test/tb_test_TinyLog/
total 28
-rw-r-----. 1 clickhouse clickhouse  64 Mar 18 15:38 brandId.bin
-rw-r-----. 1 clickhouse clickhouse  74 Mar 18 15:38 id.bin
-rw-r-----. 1 clickhouse clickhouse  77 Mar 18 15:38 saleDate.bin
-rw-r-----. 1 clickhouse clickhouse  64 Mar 18 15:38 saleMoney.bin
-rw-r-----. 1 clickhouse clickhouse  64 Mar 18 15:38 shopId.bin
-rw-r-----. 1 clickhouse clickhouse 187 Mar 18 15:38 sizes.json
-rw-r-----. 1 clickhouse clickhouse  74 Mar 18 15:38 vipId.bin

[clickhouse@worker1 ~]$ cat  /var/lib/clickhouse/data/test/tb_test_TinyLog/sizes.json 
{"yandex":{"brandId%2Ebin":{"size":"64"},"id%2Ebin":{"size":"74"},"saleDate%2Ebin":{"size":"77"},"saleMoney%2Ebin":{"size":"64"},"shopId%2Ebin":{"size":"64"},"vipId%2Ebin":{"size":"74"}}}

Se puede ver que los datos insertados más tarde se adjuntan al final de cada archivo de campo. No se agregarán archivos nuevos.
TinyLog es el motor de tablas de menor rendimiento de la serie de la familia de registros. La estructura de almacenamiento consta de dos partes: archivos de datos y metadatos. Los archivos de datos se almacenan de forma independiente según las columnas, es decir, cada campo de columna tiene un archivo bin correspondiente. TinyLog no admite particiones, no tiene archivos mrk y no admite operaciones de lectura paralelas de archivos bin. Solo es adecuado para su uso en escenarios muy simples.

Motor StripLog

#创建表
CREATE TABLE tb_test_StripeLog
(
    `id` Int64, 
    `vipId` Int64, 
    `brandId` Int32, 
    `shopId` Int32, 
    `saleDate` Datetime64, 
    `saleMoney` Float32
)
ENGINE = StripeLog
# 查看建表目录
[clickhouse@worker1 ~]$ ll /var/lib/clickhouse/data/test/
total 0
drwxr-x---. 2 clickhouse clickhouse   6 Mar 18 15:42 tb_test_StripeLog
drwxr-x---. 2 clickhouse clickhouse 133 Mar 18 15:38 tb_test_TinyLog
[clickhouse@worker1 ~]$ ll /var/lib/clickhouse/data/test/tb_test_StripeLog/
total 0
# 插入数据
insert into tb_test_TinyLog values (10001,8001,429,6001,'2021-03-18 14:15:23',200.50);

SELECT * FROM tb_test_StripeLog

┌─id─┬─vipId─┬─brandId─┬─shopId─┬────────────────saleDate─┬─saleMoney─┐
│  1800142960012021-03-18 14:15:23.000200.5 │
└────┴───────┴─────────┴────────┴─────────────────────────┴───────────┘
[clickhouse@worker1 ~]$ ll /var/lib/clickhouse/data/test/tb_test_StripeLog/
total 12
-rw-r-----. 1 clickhouse clickhouse 314 Mar 18 15:44 data.bin
-rw-r-----. 1 clickhouse clickhouse 137 Mar 18 15:44 index.mrk
-rw-r-----. 1 clickhouse clickhouse  69 Mar 18 15:44 sizes.json

[clickhouse@worker1 ~]$ cat  /var/lib/clickhouse/data/test/tb_test_StripeLog/sizes.json 
{
   
   "yandex":{
   
   "data%2Ebin":{
   
   "size":"314"},"index%2Emrk":{
   
   "size":"137"}}}

① archivo de datos data.bin, todos los campos de columna se guardan en un archivo y sus datos se escribirán en data.bin.

② index.mrk: archivo de etiqueta de datos, que guarda la información de ubicación de los datos en el archivo data.bin. El uso de etiquetas de datos puede usar varios subprocesos para leer bloques de datos comprimidos en data.bin de manera paralela, mejorando así el rendimiento de la consulta de datos.

③ size.json: archivo de metadatos, que registra el tamaño de data.bin e index.mrk.

# 继续插入数据
insert into tb_test_StripeLog values (0002,8001,429,6001,'2021-03-18 14:15:23',200.50),(0003,8001,429,6001,'2021-03-18 14:15:23',400.50);

select * from tb_test_StripeLog;

┌─id─┬─vipId─┬─brandId─┬─shopId─┬────────────────saleDate─┬─saleMoney─┐
│  1800142960012021-03-18 14:15:23.000200.5 │
└────┴───────┴─────────┴────────┴─────────────────────────┴───────────┘
┌─id─┬─vipId─┬─brandId─┬─shopId─┬────────────────saleDate─┬─saleMoney─┐
│  2800142960012021-03-18 14:15:23.000200.5 │
│  3800142960012021-03-18 14:15:23.000400.5 │
└────┴───────┴─────────┴────────┴─────────────────────────┴───────────┘
[clickhouse@worker1 ~]$ ll /var/lib/clickhouse/data/test/tb_test_StripeLog/
total 12
-rw-r-----. 1 clickhouse clickhouse 658 Mar 18 15:47 data.bin
-rw-r-----. 1 clickhouse clickhouse 274 Mar 18 15:47 index.mrk
-rw-r-----. 1 clickhouse clickhouse  69 Mar 18 15:47 sizes.json`

Se puede ver que la inserción de datos se agregará al archivo de datos data.bin.

Bueno, lo anterior es la situación básica del motor de registro. El seguimiento de otros motores de tabla se presentará en la siguiente sección.

Para obtener contenido más interesante, preste atención a la cuenta pública de WeChat

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_45320660/article/details/115166214
Recomendado
Clasificación