StripeLog

该引擎属于日志引擎系列。请在日志引擎系列文章中查看引擎的共同属性和差异。

在你需要写入许多小数据量(小于一百万行)的表的场景下使用这个引擎。

建表

  1. CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
  2. (
  3. column1_name [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
  4. column2_name [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
  5. ...
  6. ) ENGINE = StripeLog

查看建表请求的详细说明。

写数据

StripeLog 引擎将所有列存储在一个文件中。对每一次 Insert 请求,ClickHouse 将数据块追加在表文件的末尾,逐列写入。

ClickHouse 为每张表写入以下文件:

  • data.bin — 数据文件。
  • index.mrk — 带标记的文件。标记包含了已插入的每个数据块中每列的偏移量。

StripeLog 引擎不支持 ALTER UPDATEALTER DELETE 操作。

读数据

带标记的文件使得 ClickHouse 可以并行的读取数据。这意味着 SELECT 请求返回行的顺序是不可预测的。使用 ORDER BY 子句对行进行排序。

使用示例

建表:

  1. CREATE TABLE stripe_log_table
  2. (
  3. timestamp DateTime,
  4. message_type String,
  5. message String
  6. )
  7. ENGINE = StripeLog

插入数据:

  1. INSERT INTO stripe_log_table VALUES (now(),'REGULAR','The first regular message')
  2. INSERT INTO stripe_log_table VALUES (now(),'REGULAR','The second regular message'),(now(),'WARNING','The first warning message')

我们使用两次 INSERT 请求从而在 data.bin 文件中创建两个数据块。

ClickHouse 在查询数据时使用多线程。每个线程读取单独的数据块并在完成后独立的返回结果行。这样的结果是,大多数情况下,输出中块的顺序和输入时相应块的顺序是不同的。例如:

  1. SELECT * FROM stripe_log_table
  1. ┌───────────timestamp─┬─message_type─┬─message────────────────────┐
  2. 2019-01-18 14:27:32 REGULAR The second regular message
  3. 2019-01-18 14:34:53 WARNING The first warning message
  4. └─────────────────────┴──────────────┴────────────────────────────┘
  5. ┌───────────timestamp─┬─message_type─┬─message───────────────────┐
  6. 2019-01-18 14:23:43 REGULAR The first regular message
  7. └─────────────────────┴──────────────┴───────────────────────────┘

对结果排序(默认增序):

  1. SELECT * FROM stripe_log_table ORDER BY timestamp
  1. ┌───────────timestamp─┬─message_type─┬─message────────────────────┐
  2. 2019-01-18 14:23:43 REGULAR The first regular message
  3. 2019-01-18 14:27:32 REGULAR The second regular message
  4. 2019-01-18 14:34:53 WARNING The first warning message
  5. └─────────────────────┴──────────────┴────────────────────────────┘