1、写
- 数据会先落到内存中,并且每次写入都是新开一个文件进行存储,因为数据写入都是Batch和Append,相当于单次顺序写入同一个文件中。这种模式避免了随机写,因此能达到很高的吞吐量。
- 由于没有事务,内部没有锁的控制,提高了写入性能。
- 由于ClickHouse的索引面向的对象是一个Part的数据,所以索引小且无需考虑修改,因此创建索引快,也同样提高了写入的性能。
2、读
- 根据日期划分partition,根据partition建立文件夹,文件夹内部保留的数据较少,减少扫描行数。
- 针对小的Part,ClickHouse会自动进行merge,减少数据量。
- Clickhouse针对列的压缩也会加快检索效率。
- 分布式表的模式使得查询压力分摊到不同承载本地表的节点上。
- vectorized query execution
3、other
- ClickHouse的列式存储特性,其实是会降低查询性能。因为列式存储需要分别查询不同的列,查询的SQL中有N列就等于需要去查询N列的数据,而行式存储只需要查询一次即可把所有列都取出。但是Clickhouse能多核并行查询,减少了影响。
- 稀疏索引其实也是会降低查询性能。
4、另外:为什么ClickHouse不适合高频的读写?
(1)读:每次query的时候都会动用一半的cpu去进行查询
(2)写:ClickHouse不是LSM TREE结构,所以无论一次写入的数据量多少都会被直接写入到filesystem中,如果高频的写入则会导致part太多
网友评论