使用云数据库ClickHouse时需要避免的操作

本文介绍使用云数据库ClickHouse时需要避免的一些操作。

避免Mutations操作

Mutations是指通过删除或更新操作来控制表数据的ALTER Query。在云数据库ClickHouse中尤其是像 ALTER TABLE … DELETEUPDATE等查询,执行这些查询将生成新的Mutation的数据版本。这也意味着这些语句将触发对所有在Mutation之前插入的数据重写,从而产生大量的写入请求。

对于更新操作,您可以通过使用专门的表引擎,如ReplacingMergeTree或CollapsingMergeTree替换默认的MergeTree表引擎,来避免大量的写入请求。

对于删除操作,使用ALTER TABLE ... DROP PARTITION或者配置表的TTL策略来避免占用大量的计算资源。

避免使用Optimize Final

使用OPTIMIZE TABLE ... FINAL 查询将启动特定表的非计划性合并,将一个table的若干data parts合并为一个data part。在此过程中,云数据库ClickHouse将会读取所有的parts,并进行解压缩、合并、将所有parts压缩存储成一个单一的part,然后重新写入存储,这将导致消耗大量的CPU和IO。即使它们已经合并为一个单一part,此优化也会重新写入一次。OPTIMIZE TABLE ... FINAL的详细信息,请参见OPTIMIZE Statement

避免使用Nullable修饰列类型

Nullable Columns可空列(例如Nullable(String))会创建一个额外的UInt8类型的列。关于Nullable Columns的详细信息,请参见Nullable。当您每次使用可空列时,都必须处理这个额外的列。这会导致增加额外的存储空间,并且总是对性能产生负面影响。Nullable Columns可以通过为列设置一个默认值来避免这个额外的列,但是不推荐使用以下操作:

CREATE TABLE default.sample
(
    `x` Int8,
    `y` Nullable(Int8)
)
ENGINE = MergeTree
ORDER BY x

您可以使用以下操作为列设置一个默认值来避免额外的列。

CREATE TABLE default.sample2
(
    `x` Int8,
    `y` Int8 DEFAULT 0
)
ENGINE = MergeTree
ORDER BY x
说明

请根据您的实际需求,设置合理的默认值。