简介

clickhouse是一个高性能的列式存储分析数据库管理系统,由俄罗斯搜索引擎公司yandex开发。

clickhouse具有以下特点

  • 高性能:clickhouse优化了查询和数据压缩算法,支持多维度数据分析和快速聚合查询。
  • 分布式:clickhouse采用共享无状态架构,可以轻松实现水平扩展,并且支持数据分片、复制等功能。
  • 可扩展性:clickhouse的内部存储格式非常灵活,可以根据需要添加或删除新的字段,支持pb级别的数据存储。

使用场景

clickhouse适用于以下场景:

  • 海量数据处理:clickhouse可以轻松处理数十亿行的数据,并在秒级别内返回查询结果。尤其对于大批量数据的入库和存储,以及后续的统计分析,clickhouse可以提供很好的支撑。
  • 复杂查询:clickhouse支持多种聚合函数和窗口函数,可以进行各种复杂的数据分析和查询操作。
  • 实时数据分析:clickhouse支持实时数据导入和查询,可以在毫秒级别内完成大规模实时数据分析任务。它对于海量数据的查询速度,相比关系型数据库MySQL/PostgreSQL,提升了不止一个数量级。
  • 总结一下,clickhouse适用于海量数据的写入、存储与查询分析,例如前端设备数据、日志数据、网页浏览数据等。

优势与劣势

优势

相比传统的关系型数据库管理系统,clickhouse具有以下优势:

  • 查询速度快:clickhouse采用列式存储和数据压缩技术,可以大幅提升查询速度。
  • 水平扩展方便:clickhouse采用共享无状态架构,可以轻松实现水平扩展。
  • 数据安全性高:clickhouse支持数据分片和复制功能,可以确保数据的可用性和安全性。
  • 存储成本低:相对于关系型数据库MySQL/PostgreSQL,文本数据库MongoDB,搜索引擎Elasticsearch,clickhouse是列式数据库压缩存储,且压缩比很高,能节省存储成本。

劣势

相比传统的关系型数据库管理系统,clickhouse也存在一些劣势:

  • 对修改操作支持度不够:clickhouse适用于海量数据的写入与存储,但是不适合与需要经常修改变动的业务数据,数据修改可能会涉及大量part操作,也不会很实时的生效。
  • 不支持事务:clickhouse不支持acid事务,对于需要事务支持的场景并不适合。
  • 数据导入速度较慢:clickhouse在数据导入方面的表现并不优秀,如果需要大规模导入数据,则需要考虑额外的优化。clickhouse不建议频繁的写入,而是建议一大批数据一次写入。
  • 复杂性:clickhouse是构建在高度优化和复杂数据结构之上的,这使得它需要更多的学习和经验才能正确地使用。对于初学者来说,它可能会有点困难。对于开发和生产使用,建议先从单节点clickhouse开始,单节点的clickhouse也足以支撑相当数量级的业务需求了。
  • 查询限制:虽然clickhouse可以处理大型数据集,但它在某些查询方面存在限制。例如,它对join的支持不太友好,当然,对于大表join,无论哪个数据库都是要慎重处理的。
  • 缺乏完整性约束:clickhouse没有内置的外键约束或其他完整性约束。因此,在数据输入时,必须谨慎确保数据的准确性和完整性。
  • 社区规模:与其他流行的开源数据库相比,clickhouse的社区还相对较小。这意味着可能很难找到足够的技术支持或资源,以及扩展其功能等方面的帮助。

性能

单个查询吞吐量

  • 如果数据被放置在page cache中,则一个不太复杂的查询在单个服务器上大约能够以2-10GB/s(未压缩)的速度进行处理(对于简单的查询,速度可以达到30GB/s)。
  • 如果数据没有在page cache中的话,那么速度将取决于你的磁盘系统和数据的压缩率。
  • 例如,如果一个磁盘允许以400MB/s的速度读取数据,并且数据压缩率是3,则数据的处理速度为1.2GB/s。这意味着,如果你是在提取一个10字节的列,那么它的处理速度大约是1-2亿行每秒。
  • 对于分布式处理,处理速度几乎是线性扩展的,但这受限于聚合或排序的结果不是那么大的情况下。

处理短查询的延时时间

  • 数据被page cache缓存的情况下,它的延迟应该小于50毫秒(最佳情况下应该小于10毫秒)。
  • 否则,延迟取决于数据的查找次数。
  • 延迟可以通过以下公式计算得知: 查找时间(10 ms)* 查询的列的数量 * 查询的数据块的数量。

处理大量短查询

  • ClickHouse可以在单个服务器上每秒处理数百个查询(在最佳的情况下最多可以处理数千个)
  • 但是由于这不适用于分析型场景。建议每秒最多查询100次。

数据写入性能

  • 建议每次写入不少于1000行的批量写入,或每秒不超过一个写入请求
  • 当使用tab-separated格式将一份数据写入到MergeTree表中时,写入速度大约为50到200MB/s。
  • 如果您写入的数据每行为1Kb,那么写入的速度为50,000到200,000行每秒。如果您的行更小,那么写入速度将更高。
  • 为了提高写入性能,您可以使用多个INSERT进行并行写入,这将带来线性的性能提升。

查询性能

  • count: 千万级别,500毫秒,1亿 800毫秒 2亿 900毫秒 3亿 1.1秒
  • group: 百万级别 200毫米,千万 1秒,1亿 10秒,2亿 20秒,3亿 30秒
  • join:千万-10万 600 毫秒, 千万 -百万:10秒,千万-千万 150秒
  • ClickHouse并非无所不能,查询语句需要不断的调优,可能与查询条件有关,不同的查询条件表是左join还是右join也是很有讲究的。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐