本文介绍使用云数据库ClickHouse时需要避免的一些操作。
避免Mutations操作
Mutations是指通过删除或更新操作来控制表数据的ALTER Query。在云数据库ClickHouse中尤其是像 ALTER TABLE … DELETE
或UPDATE
等查询,执行这些查询将生成新的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
请根据您的实际需求,设置合理的默认值。