ClickHouse采用列式存储,每一列数据独立存储在一起,通过压缩提高读取效率。
表由多个数据部分组成,每个数据部分对应一个块,每个块进一步分为一系列分块,每个分块对应一列。这种设计减小随机访问开销。
Copy
Table
|- Data Part 1
|- Block 1
|- Column Chunks
|- Block 2
|- Column Chunks
|- Data Part 2
索引设计
每个表创建主键索引和辅助索引:
- 主键索引根据主键列值范围分布数据和块
- 辅助索引通过B树和哈希查找主键范围快速定位块
此外还支持超文本索引、功能索引等不同类型的索引加速查询。
典型使用场景
- 网站日志分析: ClickHouse擅长排序,聚合和 joins查询,适用于网页浏览日志统计。
sql
Copy
SELECT
count(),
sum(response_length)
FROM apache_logs
GROUP BY counter_id
- 实时指标监控:通过推送或者从MQ中同步拉取监控指标,支持毫秒级查询响应。
sql
Copy
CREATE TABLE metrics ON CLUSTER sharded_cluster
- 运营数据分析:ClickHouse支持PB级存量数据查询,适用于积累 massivedata的定期报表。
sql
Copy
SELECT
SUM(amount)
FROM orders
GROUP BY date, region
- IoT数据湖:多列型数据写入高吞吐,支持随时查询和展开分析使用情景。
sql
Copy
INSERT INTO iot_data
VALUES
('sensor1', toDateTime(now()), 20)
总体来说,ClickHouse通过其优异的列存储和索引设计,为大数据实时查询和分析提供了高性能的解决方案。目前广泛应用在以上典型场景中。 ClickHouse支持实时数据的写入和查询。
关于实时写入,ClickHouse主要通过以下方式实现:
- 支持高吞吐的基于原子提交的插入操作。单次插入可以处理数百万行数据。
- 使用高性能消息队列如Kafka作为数据源,支持以流式实时方式将数据同步到ClickHouse中。
- 提供Mergetree引擎实时合并小文件。写操作被顺序写入文件,读操作直接访问合并后的大文件获得更高性能。
- 支持原始日志实时消费和解析到ClickHouse,实现零数据丢失的低延迟整合。
关于实时查询,ClickHouse通过以下优势实现毫秒级响应:
- 数据按列式存储布局,导读压缩后的列数据直接扫描查询。
- 提供多个并行索引加速数据定位,如功能模糊索引、微调索引等。
- 支持动态分区表,批量小文件合并后实时扩容计算资源。
- ClickHouse引擎本身提供高并发能力,支持百万甚至亿级QPS查询负载。
- 通过HTTP接口支持近实时的数据可视化DASHBOARD。
总结来说,结合高吞吐写入和低延迟实时查询两个优势,ClickHouse完全满足大数据实时处理和即席查询的需求场景。目前很多公司都在生产环境成功应用它用于实时数据中心。