SuperAPI AI 工具集

clickhouse-io

数据与分析

查看项目

更新于 10-15 08:34

技能介绍

用途

本技能面向 ClickHouse 的高性能分析与数据工程场景,提供 ClickHouse 特有的模式与最佳实践。适用于以下情况:设计 ClickHouse 表结构(MergeTree 引擎选型);编写分析查询(聚合、窗口函数、连接);优化查询性能(分区裁剪、投影、物化视图);大批量数据写入(批量插入、Kafka 集成);从 PostgreSQL/MySQL 迁移到 ClickHouse 做分析;实现实时仪表盘或时间序列分析。

概述

ClickHouse 是面向在线分析处理(OLAP)的列式数据库管理系统,针对大数据集上的快速分析查询进行了优化。关键特性包括:列式存储、数据压缩、并行查询执行、分布式查询、实时分析。

表设计模式

  • MergeTree 引擎(最常用):按 toYYYYMM(date) 分区,ORDER BY (date, market_id),可设置 index_granularity。
  • ReplacingMergeTree(去重):适用于可能来自多个来源、存在重复的数据,按用户与事件 ID 排序并设主键。
  • AggregatingMergeTree(预聚合):用于维护聚合指标,使用 AggregateFunction 类型,查询时用 sumMerge、countMerge、uniqMerge 等合并函数。

查询优化模式

  • 高效过滤:优先使用已索引列(如 date、market_id)过滤,避免先对非索引列(如 volume、market_name LIKE)过滤。
  • 聚合:使用 ClickHouse 特有聚合函数,如 toStartOfDay、uniq、avg;用 quantile 计算分位数(比 percentile 更高效)。
  • 窗口函数:可用 sum(...) OVER (PARTITION BY ... ORDER BY ... ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 计算累计值。

数据写入模式

  • 批量插入(推荐):使用 @clickhouse/client 的 insert 方法,配合 JSONEachRow 格式一次性写入多条记录。
  • 避免逐条插入:不要在循环中单条插入。
  • 流式插入:可将 Readable.from(dataSource, { objectMode: true }) 作为 values 传入,用于持续数据摄入。

物化视图

可创建物化视图实现实时聚合,例如按小时统计的 market_stats_hourly_mv,使用 sumState、countState、uniqState 写入目标表,查询时用对应的 Merge 函数读取。

性能监控

  • 查询性能:查询 system.query_log,筛选 type = 'QueryFinish'、query_duration_ms > 1000 的慢查询,查看读取行数、字节数与内存使用。
  • 表统计:查询 system.parts,按数据库与表统计大小、行数与最近修改时间。

常见分析查询

  • 时间序列分析:如按日统计日活用户(uniq(user_id))。
  • 留存分析:通过 dateDiff 计算注册后第 0/1/7/30 天活跃情况。
  • 漏斗分析:用 countIf 统计各步骤人数并计算转化率。
  • 同期群分析:按注册月份分组,统计各月活跃用户。

数据管道模式

  • ETL:从源(如 PostgreSQL)抽取、转换后批量写入 ClickHouse,可定时执行。
  • 变更数据捕获(CDC):通过 PostgreSQL 的 LISTEN/notification 监听变更并同步到 ClickHouse。

最佳实践

  1. 分区策略:按时间(通常月或日)分区,避免分区过多,分区键使用 DATE 类型。
  2. 排序键:最常过滤的列放前面,考虑基数(高基数优先),排序影响压缩。
  3. 数据类型:使用最小的合适类型(UInt32 而非 UInt64),重复字符串用 LowCardinality,分类数据用 Enum。
  4. 避免:SELECT *(应指定列)、FINAL(改为查询前合并数据)、过多 JOIN(分析场景可反规范化)、小而频繁的插入(应批量)。
  5. 监控:跟踪查询性能、监控磁盘使用、检查合并操作、查看慢查询日志。

限制

资料未提供该技能的安装方式、收费模式、支持平台或具体使用步骤,相关内容暂未提供。