ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。
常见的列式数据库有: Vertica、 Paraccel (Actian Matrix,Amazon Redshift)、 Sybase IQ、 Exasol、 Infobright、 InfiniDB、 MonetDB (VectorWise, Actian Vector)、 LucidDB、 SAP HANA、 Google Dremel、 Google PowerDrill、 Druid、 kdb+。
不同的存储方式适合不同的场景,这里的查询场景包括:
系统负载越高,根据使用场景进行定制化就越重要,并且定制将会变的越精细。没有一个系统同样适用于明显不同的场景。如果系统适用于广泛的场景,在负载高的情况下,所有的场景可以会被公平但低效处理,或者高效处理一小部分场景。
优点
缺点
官方的性能测试对比报告参见:https://clickhouse.yandex/benchmark.html
知乎上的一篇OLAP引擎比较:https://zhuanlan.zhihu.com/p/54907288
在一张有44个字段的大表中做单表查询并且和Amazon RedShift做对比,结果如下:
Clickhouse 测试环境:单CPU 2核 4G内存
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l # # 查看物理CPU个数
cat /proc/cpuinfo| grep "cpu cores"| uniq # 查看每个物理CPU中core的个数(即核数)
数据量:1580万
clickhouse engine和index:
ENGINE = ReplacingMergeTree(insert_time)
order by (membership_uid, business_group_uid, calendar_date, insert_time);
Sql执行速度取决于:执行时间execution和数据拉取时间fetching
Clickhouse:
select * from dm.delphi_membership_properties t where t.membership_id=666; -- 160ms
select * from dm.delphi_membership_properties t where t.membership_uid='3ec723abeffc470ea42593f0d1e9d279'; -- 120ms
select count(*) from dm.delphi_membership_properties t where t.business_group_id=44; -- 120ms
select account_phone from dm.delphi_membership_properties t where t.membership_id=666; -- 58ms
select account_phone from dm.delphi_membership_properties t where t.membership_uid='3ec723abeffc470ea42593f0d1e9d279'; -- 44 ms
select account_phone from dm.delphi_membership_properties t where t.business_group_id=44; -- 190ms
RedShift: 机器配置高于clickhouse单机数倍
select * from dm.delphi_membership_properties t where t.business_group_id=44; -- 1286条数据一次取出来时间较长
select * from dm.delphi_membership_properties t where t.business_group_uid='7a68b4a7350c4d7288e8befef91f8581'; -- 1286条数据一次取出来时间较长
select count(*) from dm.delphi_membership_properties t where t.business_group_uid='fa26f456030940b8b6ec4b56e256aee2'; -- 250ms
select account_phone from dm.delphi_membership_properties t where t.business_group_uid='7a68b4a7350c4d7288e8befef91f8581'; -- 360ms
select count(distinct t.membership_uid) from dm.delphi_membership_properties t where t.business_group_uid='fa26f456030940b8b6ec4b56e256aee2'; -- 450ms
将clickhouse 表engine的order by key修改如下:颗粒度小的在后
ENGINE = ReplacingMergeTree(insert_time)
order by (business_group_uid, calendar_date, created_at, insert_time, membership_uid);
修改order by key之后含有bguid的查询速度大幅提升,均低于60ms。这个速度提升主要是clickhouse的稀疏索引导致的,关于索引会在其他文章中介绍到。