TinyLog

以列文件的形式将数据存储到磁盘上,缺点是不支持索引,没有并发控制,生产环境不用。

Memory

数据以未压缩的原始格式存储在内存中,缺点是重启数据会丢失,不支持索引,但是读写没有阻塞操作,在数据量不大且简单查询具有非常高的性能。

MergeTree

mergetree是经常用到的表引擎,建表时使用示例如下:

  1. create table if not exists student(
  2. id int,
  3. name String,
  4. age UInt8,
  5. create_time DateTime
  6. ) ENGINE MergeTree
  7. partition by toYYYYMMDD(create_time)
  8. primary key(id)
  9. order by (id, age)
  10. insert into student(`id`, `name`, `age`, `create_time`)
  11. VALUES (100, 'ma', 10, '2021-08-06'),
  12. (101, 'ma', 10, '2021-08-07')

该sql将会创建一个名称为student的表,指定表引擎为MegerTree.

<font style="color:#F5222D;">partition by</font> 表分区字段,该语句中,是根据日期进行分区,可选项

分区会将数据保存在不同的目录下,一个分区一个目录,如果建表的时候不写分区,那就使用<font style="color:#F5222D;">all</font>分区,即不进行分区如:

常用表引擎 - 图1

分区名称格式为:分区值 + 最小区块编号 + 最大区块编号 + 合并次数,由于刚刚创建表时使用的是create_time进行分区,所以会有2021080620210807的分区,出现有两个20210807分区的原因是因为,刚刚创建的数据,clickhouse并不会马上进行分区合并,而是需要等待10-15分钟才会自动进行分区合并,合并后的分区名是20210807_8_9_1,也可以使用命令**OPTIMIZE TABLE **student** FINAL**进行分区合并,但是分区合并后的原数据不会马上进行删除,依然要等clickhouse进行清理,如下图:

常用表引擎 - 图2

<font style="color:#F5222D;">primary key</font> 主键索引,在clickhouse中,主键是一级索引主键不会添加唯一约束,主键是一个稀疏索引,可选项

比如:在数据库再插入一条id=100的记录

常用表引擎 - 图3

order by 排序字段,必填项,在本例中order by(id,age),那么主键必须是id 或者 id,age中的一个