表引擎决定了数据的存储方式和位置、支持哪些查询以及如何支持、是否支持并发数据访问、是否存在索引及使用规则、是否可以执行多线程请求、数据复制参数。
clickhouse表引擎的分类:MergeTree家族、Log家族、集成引擎、特殊引擎
1. Log家族
Log家族主要用于小表数据分析,快速写入(最多约100w行),全表读取。包括StripeLog、Log、TinyLog。
共性:数据按顺序追加到磁盘文件、不支持alter操作(更新、删除、更改表结构均为alter操作)、不支持索引(select范围查询效率不高)、不支持原子写(服务器意外中断数据会损坏)、并发访问数据锁(insert会阻塞select操作)。
TinyLog :最简单,功能最差,效率最低。不支持并发读取数据文件,查询性能最差;与log引擎一样每一列存储在一个单独文件;适用于write-once表,小批量处理中间数据。
StripLog:支持并发读取数据文件(多线程读取);将所有列存储在同一个大文件中,减少了文件描述符;
Log:支持并发读取数据文件;每个列会单独存储在一个独立文件中,查询效率较高。
适用于临时数据,write-once 表以及测试或演示目的。
建表语句:
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 = StripeLog
其中:
(1)ON CLUSTER表示在集群中每个节点建表,cluster name为逻辑集群名称自定义。Cluster由yaml文件定义,物理集群和逻辑集群松耦合,即一个物理集群可能存在多个逻辑集群。若不加ON CLUSTER标识仅在当前节点建表。
(2)Log家族ENGINE可选值为:StripeLog、Log、TinyLog,该字段大小写敏感
(3)type字段大小写敏感
示例:
CREATE TABLE IF NOT EXISTS default.TinyLogTest2(c1 String,c2 UInt16) ENGINE = TinyLog;
CREATE TABLE IF NOT EXISTS default.LogTest2(c1 String,c2 UInt16) ENGINE = Log;
CREATE TABLE IF NOT EXISTS default.StripelogTest1(c1 String,c2 UInt16) ENGINE = Stripelog;
>> ls
LogTest2 StripeLogTest1 TinyLogTest2 (每个表存储在一个单独文件夹下)
>>cd TinyLogTest2
>>ls
c1.bin c2.bin sizes.json (c1.bin 列c1的数据文件、c2.bin 列c2的数据文件)
>>cat sizes.json
{"yandex":{"c1%2Ebin":{"size":"131"},"c2%2Ebin":{"size":"112"}}}
>> cd StripeLogTest1
>> ls
data.bin index.mrk sizes.json
(data.bin 数据文件、index.mrk 标记文件,标记每个数据块每列的偏移量)
>>cat sizes.json
{"yandex":{"data%2Ebin":{"size":"338"},"index%2Emrk":{"size":"187"}}}
>> cd LogTest2
>> ls
c1.bin c2.bin __marks.mrk sizes.json
>&g