ClickHouse入门了解

一、ClickHouse简介

ClickHouse是一个面向列的数据库管理系统 (DBMS),多用于查询的在线分析处理 (OLAP),是一款 PB 级的交互式分析数据库
1.首先说一下什么是面向列的DBMS:
像MySQL、Postgres 和 SQL Server等都是面向行存储的。对于同一张表,比如表结构有id,name,Hobby等十几个字段,面向行存储的DBMS会把同一行的数据放在同一个数据块中,而面向列存储的DBMs会把同一列的数据放在同一个数据块中。当我们对这两种数据库同时查询Hobby为swimming的id和name数据,面向行的DBMS查找到符合条件的每一行数据块后,会在数据块遍历每列中找出id,name字段,效率很低。而面向列的DBMS查找到符合条件的行后,可以直接将其的id,name列拿出来,这就是我们要的数据,面向列的存储会让效率大大提升!
2.再简单说下在线分析处理 (OLAP)场景所具备的关键属性:

  • 绝大多数请求是读取访问。
  • 数据以相当大的批次(> 1000 行)更新,而不是单行更新
  • 对于读取,从数据库中提取了相当多的行,但只提取了部分列。
  • 表是“宽的”,这意味着它们包含大量列
  • 等等
    在这种情况需求下,ClickHouse应运而生!

二、ClickHouse特性

clickhouse特性突出就是一个字:快!
有多快?
有一项对比实验,所有用于对比的数据库都使用了相同配置的服务器,在单个节点的情况下,对一张拥有133个字段的数据表分别在1000万、1亿和10亿三种数据体量下执行基准测试,基准测试的范围涵盖43项SQL查询。在1亿数据集体量的情况下,ClickHouse的平均响应速度是 Vertica 的2.63倍、InfiniDB的17倍、MonetDB 的27倍、Hive 的126倍、MySQL 的429倍以及 Greenplum 的10倍。详细的测试结果可以查阅https://clickhouse.yandex/benchmark.html。

它是神仙吗?为什么这么快?官方给出的解释如下:
1.面向列的存储:
源数据通常包含数百甚至数千列,而一条sql使用的可能只有其中几列。系统需要避免读取不必要的列,否则会浪费最昂贵的磁盘读取操作
2.索引
ClickHouse 将数据结构保存在内存中,不仅允许读取使用过的列,而且允许读取这些列的必要行范围。
3.数据压缩
将同一列的不同值存储在一起通常会导致更好的压缩率(与面向行的系统相比),因为在实际数据中,列的相邻行通常具有相同或不同的值。除了通用压缩之外,ClickHouse 还支持可以使数据更加紧凑的专用编解码器。
4.向量化查询执行
ClickHouse 不仅将数据存储在列中,还可以处理列中的数据。它可以提高 CPU 缓存利用率,并允许使用SIMD CPU 指令。
5.可扩展性
ClickHouse 可以利用所有可用的 CPU 内核和磁盘来执行单个查询。不仅在单个服务器上,而且还包括集群的所有 CPU 内核和磁盘。
6.自由的压缩算法选择。不同列的数据具有不同的数据类型,适用的压缩算法也就不尽相同。可以针对不同列类型,选择最合适的压缩算法。
7.由于最合适的压缩算法的选择,可以使数据有更高的压缩比,意味着同等大小的内存能够存放更多数据,从磁盘中读取相应数据耗时更短。

三、ClickHouse劣势

1.单表查询性能高,但是 Join 性能不高。
JOIN操作时一定要把数据量小的表放在右边,ClickHouse中无论是Left Join 、Right Join还是Inner Join永远都是拿着右表中的每一条记录到左表中查找该记录是否存在,所以右表必须是小表
2.无法高效地更新单行/多行数据,原因:
ClickHouse的异步update机制。ClickHouse对update的执行是低效的,ClickHouse内核中的MergeTree存储一旦生成一个Data Part,这个Data Part就不可再更改了。所以从MergeTree存储内核层面,ClickHouse就不擅长做数据更新删除操作。
当用户执行一个如上的Update操作获得返回时,ClickHouse内核其实只做了两件事情:
(1)检查Update操作是否合法;
(2)保存Update命令到存储文件中,唤醒一个异步处理merge和mutation的工作线程;异步线程的工作流程极其复杂,总结其精髓描述如下:先查找到需要update的数据所在datapart,之后对整个datapart做扫描,更新需要变更的数据,然后再将数据重新落盘生成新的datapart,最后用新的datapart做替代并remove掉过期的datapart。
这就是ClickHouse对update指令的执行过程,可以看出,频繁的update指令对于ClickHouse来说将是灾难性的。
3.扩容/缩容后数据无法自动平衡,只能通过低效的数据重新导入的方式来进行人工平衡。
4.ClickHouse不支持事务,不存在隔离级别。ClickHouse的定位是分析性数据库,而不是严格的关系型数据库

四、ClickHouse其他优势

clickhouse除了快的优势,还支持多种丰富的表引擎及内置函数。详细请见官网文档:https://clickhouse.tech/docs/zh/

猜你喜欢

转载自blog.csdn.net/weixin_44123540/article/details/119039973