全面的 ClickHouse 指南,涵盖表结构设计、查询优化和数据写入。包含 3 大类(表结构、查询、写入)共 28 条规则,按影响程度排序。
官方文档: ClickHouse 最佳实践
优先级顺序:
rules/ 目录中是否有适用的规则规则名称..."的格式引用为什么规则优先: ClickHouse 具有特殊的行为特性(列式存储、稀疏索引、合并树机制),在这些场景下,通用的数据库直觉可能会产生误导。
审查表结构、查询或配置时,请按以下格式组织输出:
text
## 检查的规则
- `规则名称-1` - 符合规范 / 存在问题
## 发现
### 问题项
- **`规则名称`**:问题描述
- 当前状态:[代码当前的做法]
- 应该做到:[正确的做法]
- 修复方案:[具体的修改建议]
### 符合规范项
- `规则名称`:简要说明为什么符合规范
## 建议
[按优先级排列的修改建议,并引用相关规则]
规则文件:
rules/schema-pk-plan-before-creation.mdrules/schema-pk-cardinality-order.mdrules/schema-pk-prioritize-filters.mdrules/schema-types-native-types.mdrules/schema-types-minimize-bitwidth.mdrules/schema-types-lowcardinality.mdrules/schema-types-avoid-nullable.mdrules/schema-partition-low-cardinality.mdrules/schema-partition-lifecycle.md检查清单:
规则文件:
rules/query-join-choose-algorithm.mdrules/query-join-filter-before.mdrules/query-join-use-any.mdrules/query-index-skipping-indices.mdrules/schema-pk-filter-on-orderby.md检查清单:
规则文件:
rules/insert-batch-size.mdrules/insert-mutation-avoid-update.mdrules/insert-mutation-avoid-delete.mdrules/insert-async-small-batches.mdrules/insert-optimize-avoid-final.md检查清单:
优先级分类影响程度前缀关注点规则数量1主键选择关键schema-pk-ORDER BY 列顺序42数据类型选择关键schema-types-原生类型、LowCardinality53JOIN 优化关键query-join-算法选择、过滤优化54批量写入关键insert-batch-每次 INSERT 10K-100K 行15避免 Mutation关键insert-mutation-ReplacingMergeTree 替代 UPDATE26分区策略高schema-partition-低基数、生命周期管理47跳数索引高query-index-bloom_filter、minmax18物化视图高query-mv-增量/可刷新物化视图29异步写入高insert-async-服务端缓冲210避免 OPTIMIZE高insert-optimize-让后台合并自然进行111JSON 使用中等schema-json-动态 schema1
schema-pk-plan-before-creation - 建表前规划 ORDER BY(不可更改)schema-pk-cardinality-order - 列按基数从低到高排序schema-pk-prioritize-filters - 包含常用过滤列schema-pk-filter-on-orderby - 查询过滤必须使用 ORDER BY 前缀schema-types-native-types - 使用原生类型,不要全用 Stringschema-types-minimize-bitwidth - 使用能容纳数据的最小数值类型schema-types-lowcardinality - 唯一值 <10K 的字符串用 LowCardinalityschema-types-enum - 有限值集合用 Enum 并启用校验schema-types-avoid-nullable - 避免 Nullable,改用 DEFAULTschema-partition-low-cardinality - 分区数量控制在 100-1,000schema-partition-lifecycle - 分区用于数据生命周期管理,而非查询优化schema-partition-query-tradeoffs - 理解分区裁剪的权衡schema-partition-start-without - 考虑先不分区schema-json-when-to-use - 动态 schema 用 JSON;已知结构用类型化列query-join-choose-algorithm - 根据表大小选择算法query-join-use-any - 只需一条匹配时用 ANY JOINquery-join-filter-before - JOIN 前先过滤query-join-consider-alternatives - 字典/宽表 vs JOINquery-join-null-handling - join_use_nulls=0 使用默认值query-index-skipping-indices - 非 ORDER BY 过滤列使用跳数索引query-mv-incremental - 实时聚合用增量物化视图query-mv-refreshable - 复杂 JOIN 用可刷新物化视图insert-batch-size - 每次 INSERT 10K-100K 行insert-async-small-batches - 高频小批量用异步写入insert-format-native - Native 格式性能最佳insert-mutation-avoid-update - 用 ReplacingMergeTree 替代 ALTER UPDATEinsert-mutation-avoid-delete - 用轻量级 DELETE 或 DROP PARTITIONinsert-optimize-avoid-final - 让后台合并自然进行本技能适用于: