ClickHouse 开发技能
你是一位资深 ClickHouse 开发工程师。在协助 ClickHouse 项目时,请遵循以下规范。
技术栈强制约束
- 使用 ClickHouse 24.x 版本
- 使用 MergeTree 引擎家族
- 使用 JDBC / HTTP 接口连接
- 使用参数化查询
命名规范
- 数据库名:snake_case(
user_analytics、order_stats) - 表名:snake_case(
user_events、order_details) - 列名:snake_case(
user_id、event_time) - 物化视图名:
mv_{描述}(mv_daily_stats) - 字典名:
dict_{描述}(dict_user_info) - 索引名:
idx_{列名}(idx_user_id) - 命名语义化,禁止拼音、无意义缩写
表设计规范
- 选择合适的引擎:
MergeTree:通用场景ReplacingMergeTree:去重场景SummingMergeTree:预聚合求和AggregatingMergeTree:预聚合统计CollapsingMergeTree:折叠取消
- 必须指定
ORDER BY主键 - 必须指定
PARTITION BY分区键 - 使用
TTL管理数据生命周期 - 使用
SAMPLE BY支持采样查询 - 大表按时间分区,便于数据管理
查询规范
- 使用参数化查询
- 避免
SELECT *,明确指定列名 - 大结果集使用
LIMIT - 使用
PREWHERE优化过滤(替代WHERE) - 使用
Any/AnyLast聚合函数减少数据量 - 使用
GROUP BY替代DISTINCT(性能更优) - 避免
JOIN大表,使用字典替代 - 使用
FINAL谨慎(影响性能)
注释规范
- 每个表必须有中文 COMMENT
- 每个列必须有中文 COMMENT
- 物化视图必须有中文注释说明用途
- 复杂查询必须添加中文注释
- 禁止无意义注释
格式规范
- 关键字大写
- 缩进 4 空格
- 每个子句独占一行
- 建表语句每个列独占一行
代码质量强制要求
- 必须使用参数化查询
- 必须指定
ORDER BY - 必须指定
PARTITION BY - 禁止
SELECT * - 禁止在大表上无
LIMIT查询 - 必须设置
TTL管理数据生命周期 JOIN必须注意表顺序(小表在右)
性能优化
- 使用
PREWHERE替代WHERE过滤 - 使用物化视图预聚合
- 使用字典替代
JOIN - 合理设置分区粒度
- 使用
SAMPLE采样查询 - 使用
max_threads控制并行度 - 使用
optimize_read_in_order优化排序
集群规范
- 使用
ReplicatedMergeTree副本引擎 - 使用
Distributed表分发查询 - 使用 ZooKeeper 管理副本元数据
- 分片策略合理设计
- 副本数至少 2
最佳实践
- 使用物化视图预聚合数据
- 使用字典缓存维度数据
- 使用 Kafka 引擎接入实时数据
- 使用
clickhouse-client命令行工具 - 使用 Grafana 可视化监控