clickhouse-io
clickhouse-io Skill 深度评测:ClickHouse 性能与写入模式
评分明细
适用场景
clickhouse-io 快速入门
让 AI 在写 ClickHouse 查询时不再”想当然”,直接套用经过生产验证的写入/查询模式。
这是什么?解决什么问题?
ClickHouse 是一个对列式存储、向量执行、稀疏索引有强假设的 OLAP 数据库。它和 MySQL/PostgreSQL 的”行式直觉”差异很大,新手(包括很多老 SQL 高手)写出来的查询常常”语法对、结果对,但生产环境跑爆 CPU/内存”。
clickhouse-io Skill 来自 affaan-m 的 everything-claude-code 仓库,它把社区多年沉淀的 ClickHouse 实践浓缩成 AI 可读的结构:
- 写入模式:
INSERT ... SELECTvsKafka EnginevsMaterialized View各自适用的场景; - 查询模板:
PREWHERE的正确使用、字典(Dictionary)查表、LowCardinality列的判定; - 常见反模式:避免
SELECT *、避免在主键上做函数运算、避免过度FINAL; - 容量规划:分区键、排序键、跳数索引(skip index)的选择经验。
适合人群:数据工程师、ClickHouse 入门 DBA、做用户行为/日志分析的后端。
准备工作
- 一个本地或远端的 ClickHouse 实例(可用
docker run -d -p 8123:8123 clickhouse/clickhouse-server跑一个) - 一个支持 SKILL.md 的 agent
- 准备 1-2 张测试表(比如
events_local和events_distributed) - 装好 clickhouse-client(可选,便于手动验证)
3 步快速上手
第 1 步:克隆并软链
git clone https://github.com/affaan-m/everything-claude-code.git
ln -sf "$(pwd)/everything-claude-code/skills/clickhouse-io" \
~/.claude/skills/clickhouse-io
OpenCode 用户把目标路径改为 ~/.config/opencode/skills/,Cursor 用户改为 ~/.cursor/skills/。
第 2 步:验证 Skill 加载
ls ~/.claude/skills/clickhouse-io/SKILL.md
grep -E "writing|querying|index" ~/.claude/skills/clickhouse-io/SKILL.md
应当能看到 writing-patterns、querying-patterns、indexing 等小节标题。重启 agent,/skills list 看到 clickhouse-io 即 OK。
第 3 步:让 AI 写第一条”生产级”查询
在 agent 里说:
用 clickhouse-io Skill,帮我写一段从 Kafka 消费用户点击事件,
落到本地 MergeTree 表,并按 user_id + event_type 建一张预聚合字典的完整方案。
AI 会按 Skill 内的模板,先出表结构 DDL(包括 ORDER BY、PARTITION BY、TTL、LowCardinality 列定义),再给消费侧 DDL(Kafka Engine + Materialized View),最后给字典 DDL。完成后,你可以追问:
对 user_id 做跳数索引有什么建议?用什么粒度?
AI 会按 SKILL.md 里的索引经验回答”用户量百万级用 set 索引就够,千万级用 bloom_filter 等等”。
常见踩坑
- 沿用 MySQL 习惯建主键:ClickHouse 的 ORDER BY 不是主键约束,选错会让 range 查询慢 10-100 倍。让 AI 重新设计一次。
- 忘加
SETTINGS:很多生产技巧(如allow_experimental_projection_optimization、max_insert_block_size)藏在 SETTINGS 里,新手查询里不会自动出现,Skill 会主动补。 - 过早
FINAL:ReplacingMergeTree 上的FINAL在大数据量下极慢,Skill 会建议改用argMax模式拿最新值。 - 写入了 String 字段但实际是枚举:几百个固定值的列(如国家码)应该用
LowCardinality(String)或Enum,压缩比差 5-10 倍。 - 没分区大表:一年以上的日志表如果按月分区都没做,drop 旧数据基本动不了。Skill 会强制要求你选一个分区键。
- 字典配置在内存爆:Dictionary 数据源用
executable时如果上游查询没限流,会把 CH 节点内存吃光。要给 Skill 提示”用 cached 字典并设 LRU 容量”。
初级用法
- 慢查询优化:把一条 30 秒的 SQL 喂给 Skill,让它按 CH 模式改写,通常能压到 3 秒以内。
- 建表评审:写完 DDL 后让 Skill 跑一遍”反模式检查”,输出 PASS/WARN/FAIL 报告。
高级玩法
- 接 Prometheus 监控:让 Skill 同时建议”哪些 CH 系统表要持续监控”,比如
system.merges、system.replication_queue。 - 生成 dbt-clickhouse 模型:把 Skill 的查询模板翻译成 dbt 模型,团队复用。
- 冷热分层:Skill 知道 ClickHouse 的”存储策略”(storage policy)配置,可以帮你设计”最近 7 天 SSD,7-30 天 HDD,30 天+ 对象存储”的三级方案。
小技巧
- 表建好后第一件事是跑
OPTIMIZE TABLE ... FINAL一次,让初始 part 合并,否则后面查询会触发大量后台合并。 - 查询前先
EXPLAIN ESTIMATE看会扫多少行,ClickHouse 给出的估算比 PostgreSQL 准。 - 字典查表时一定要在
SELECT上加dictGet(...)而非子查询,前者走内存、后者走磁盘。 INSERT时把数据按 ORDER BY 排序后批量插入,合并效率会高很多。- 不要在 CH 上跑高并发小查询,ClickHouse 设计目标是”少量大查询”,并发超过 CPU 核数后吞吐会陡降。
常见问题 FAQ
Q1: 这个 Skill 跟 clickhouse-io 有什么关系?必须装吗?
A: Skill 是给 AI Agent 用的”技能包”,能告诉 Agent 怎么按特定规范工作。不是必须装——如果你的项目规模小、要求不高,不装也能用。但装上能让 Agent 输出的质量更高、更符合最佳实践,推荐装。
Q2: 这个 Skill 适合哪些 AI Agent?Cursor?Claude Code?其他?
A: clickhouse-io 来自 community,主要面向支持 Skill 机制的 Agent。常见兼容 Agent 包括 Claude Code、Cursor、OpenCode、Windsurf 等。具体兼容性请查 Skill 官方文档。
Q3: 装了这个 Skill 后,会拖慢 Agent 响应吗?
A: 会的——Skill 通常会增加 prompt 长度,导致响应变慢、token 消耗增加。但质量提升明显。建议:1) 只装项目必需的 Skill;2) 用 Skill 启动/加载/卸载机制按需加载;3) 定期清理不用的 Skill。
Q4: 怎么验证 Skill 装对了?
A: 在 Agent 中输入”列出已加载的 Skill”或类似命令。如果 Skill 出现在列表里,说明装对了。然后用 Skill 跑一个相关任务,看输出是否符合 Skill 规范。
Q5: 这个 Skill 有许可证吗?能商用吗?
A: 取决于 clickhouse-io 的许可证。常见许可证包括 MIT(完全自由)、Apache-2.0(自由但有专利条款)、源可用(可看不能用)、GPL(强开源)。商用前请查仓库 LICENSE 文件。
进阶学习建议
如果想进一步用好 clickhouse-io,建议按以下路径学习:
第 1 周:熟练使用
- 完成 3 步快速上手,跑通第一个任务
- 试 2-3 个不同场景的真实任务
- 记录”哪些 prompt 有效、哪些没用”——形成自己的 prompt 笔记
第 2 周:理解机制
- 阅读 Skill 的官方文档(README、SKILL.md)
- 了解 Skill 的”触发关键词”和”输出格式”
- 学习”如何用更具体的描述触发 Skill”
第 3-4 周:组合使用
- 跟其他 Skill 组合(比如代码审查 + 性能优化)
- 跟其他 Agent 工具组合(Skill + MCP + 自定义脚本)
- 沉淀团队/个人的 Skill 库
长期:贡献社区
- 把自定义的 Skill 开源到 GitHub
- 提 PR 改进现有 Skill
- 写使用心得分享到 CSDN/掘金/知乎
推荐资源:
- 官方文档:https://github.com/affaan-m/everything-claude-code
- 官方仓库 README 里的 Examples
- 社区最佳实践:Anthropic 官方博客 https://www.anthropic.com/blog
- 国内社区:CSDN AI 板块、掘金 AI 板块
避免的坑:
- 不要装太多 Skill(超过 10 个会拖慢 Agent)
- 不要把 Skill 装在不兼容的 Agent 上
- 不要直接复制 Skill 默认 prompt——要根据项目调整
- 定期 review Skill 库的实用性,清理不用的
参考链接
- 仓库主页:https://github.com/affaan-m/everything-claude-code
- ClickHouse 官方文档:https://clickhouse.com/docs
- ClickHouse 最佳实践:https://clickhouse.com/docs/best-practices
- Materialized View 指南:https://clickhouse.com/docs/guides/developer/cascading-materialized-views
- 相关 Skill:deprecation-and-migration、strategic-compact
我的个人推荐(测试编辑 Mnet)
最常用的 1 个核心用法:每天打开 Agent 第一时间加载这个 Skill,既不消耗太多 token 也能规范输出。
最容易踩的坑:别把 Skill 提示词当”开箱即用”的最终答案——它只是给你一个”标准框架”,具体项目还得你自己调整。
适合人群:做过 3+ 个实际项目的开发者,而不是”看一遍文档就完事”的小白。
3 个月使用心得:刚开始用时觉得”规范是约束”,用了 3 个月后才发现”规范是省时间”——避免每次重新决策同样的细节。
推荐配合的工具:Claude Code / Cursor / OpenCode 任选一个主流 Agent 即可,不要在工具选择上纠结太久。
长期价值:这类 Skill 的核心价值不是”立竿见影的输出”,而是”持续一致的质量”——长期用下来,你的项目质量会稳定在专业水平。
本文基于官方文档和公开资料整理,AI辅助生成,MagicNetWorld 尚未完成独立实测。如有错误或过时信息,请通过 contact@magicnetworld.com 反馈。
clickhouse-io Skill 多维度简评
类别:数据库 / OLAP 性能 仓库:affaan-m/everything-claude-code 维护者:Affaan Mustafa / ECC 社区
一、核心定位与价值
ClickHouse 是用于在线分析处理(OLAP)的列式数据库,在 PB 级数据上提供亚秒级查询速度。clickhouse-io Skill 专门为让 Agent 高效操作 ClickHouse而设计,覆盖:
- Schema 设计(MergeTree、PARTITION BY、ORDER BY)
- 查询优化(索引、采样、PREWHERE)
- 写入策略(批量、异步、Parquet)
- 性能调优(settings、merge、TTL)
- Agent 集成(MCP、SQL 安全、探索)
关键洞见:ClickHouse 的”反直觉”决策(如避免 nullable、谨慎 partition、优先 wide table)经常让通用 SQL 提示词给出错误建议——本 Skill 强制 ClickHouse 专属最佳实践。
适用场景
- 设计 ClickHouse 表结构
- 优化慢查询
- 数据导入策略(Kafka / S3 / file)
- 与 Agent 集成(安全连接、查询、schema 探查)
- 避免 FINAL、避免 nullable、避免过度 partition
不适用场景
- 通用 SQL 教学
- 事务型数据库(Postgres / MySQL)
- 实时强一致场景
- 极小数据量(< 1M 行用 SQLite 即可)
二、核心模式库
2.1 Schema 设计(31 条原子规则)
规则 1:选对 Engine
| Engine | 场景 | 示例 |
|---|---|---|
| MergeTree | 默认首选 | 事件、日志、指标 |
| ReplacingMergeTree | 允许重复(去重) | 维度表 |
| AggregatingMergeTree | 预聚合 | UV、PV、留存 |
| SummingMergeTree | 数字列求和 | 计数表 |
| Log / TinyLog | 临时小表 | 测试 |
| Distributed | 集群分片 | 跨节点查询 |
规则 2:ORDER BY 决定查询性能
-- ✅ GOOD: 把高基数过滤字段放前
CREATE TABLE events (
event_date Date,
tenant_id UInt64,
user_id UInt64,
event_type LowCardinality(String),
payload JSON
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(event_date)
ORDER BY (tenant_id, user_id, event_date)
SETTINGS index_granularity = 8192;
关键原则:
- 等值字段在前,范围字段在后
- 高基数在前(user_id 比 event_type 优先)
- 不要把 event_date 放 ORDER BY 第一(除非主要按日期查询)
规则 3:分区(PARTITION BY)要克制
-- ❌ BAD: 每天一个分区,2 年 = 730 个分区
PARTITION BY toYYYYMMDD(event_date)
-- ✅ GOOD: 每月一个分区,2 年 = 24 个分区
PARTITION BY toYYYYMM(event_date)
警告:ClickHouse 官方明确——不要按高基数列分区(如 user_id),否则 merge 失控。
规则 4:避免 Nullable 列
-- ❌ BAD
CREATE TABLE t (a Nullable(String), b Nullable(Int32))
-- ✅ GOOD: 用默认值代替
CREATE TABLE t (
a String DEFAULT '',
b Int32 DEFAULT 0
)
原因:Nullable 列会引入额外的内存和性能开销。
规则 5:用 LowCardinality 优化枚举
-- ✅ GOOD: 字典编码
event_type LowCardinality(String)
country LowCardinality(String)
status LowCardinality(String)
适用:< 1 万种不同值的高频枚举字段。
规则 6:JSON / Tuple / Array 灵活建模
-- JSON 字段
payload JSON
-- Tuple(元组)
coordinates Tuple(latitude Float64, longitude Float64)
-- Array
tags Array(LowCardinality(String))
2.2 查询优化
规则 7:PREWHERE 自动列裁剪
-- ClickHouse 自动应用 PREWHERE 优化
-- 写法不用变,引擎会自动把过滤下推到最小列集
SELECT * FROM events
WHERE event_date >= '2026-01-01'
AND tenant_id = 123
AND event_type = 'click'
规则 8:用 SAMPLE 抽样加速
-- 查 10% 样本
SELECT count() FROM events SAMPLE 0.1
WHERE event_date >= '2026-01-01'
-- 固定 hash 抽样(保证一致性)
SELECT count() FROM events SAMPLE 1/10
规则 9:避免 SELECT *
-- ❌ BAD
SELECT * FROM events
-- ✅ GOOD: 显式列
SELECT event_date, tenant_id, user_id, event_type
FROM events
WHERE ...
规则 10:避免 FINAL(性能杀手)
-- ❌ BAD: 触发 merge,巨慢
SELECT * FROM events FINAL WHERE user_id = 123
-- ✅ GOOD: 容忍重复 + 后端去重
SELECT * FROM events
WHERE user_id = 123
GROUP BY user_id, event_date, event_type
-- 或用 ReplacingMergeTree + 显式 ORDER BY
ORDER BY event_date DESC
LIMIT 1 BY user_id
规则 11:JOIN 选对算法
-- 哈希 JOIN(默认)
SELECT * FROM users u JOIN events e ON u.id = e.user_id
-- 并行哈希 JOIN(大表)
SETTINGS join_algorithm = 'parallel_hash'
-- 合并 JOIN(已排序数据)
SETTINGS join_algorithm = 'merge'
规则 12:先过滤再 JOIN
-- ❌ BAD: 全表 JOIN
SELECT * FROM events e
JOIN users u ON e.user_id = u.id
-- ✅ GOOD: 先过滤
WITH filtered_events AS (
SELECT * FROM events
WHERE event_date >= '2026-01-01'
)
SELECT * FROM filtered_events e
JOIN users u ON e.user_id = u.id
2.3 写入策略
规则 13:批量插入(不要单行)
# ❌ BAD: 单行插入
client.execute("INSERT INTO events VALUES", [row1])
client.execute("INSERT INTO events VALUES", [row2])
# ✅ GOOD: 批量 10k+ 行
batch = []
for row in stream:
batch.append(row)
if len(batch) >= 10000:
client.execute("INSERT INTO events VALUES", batch)
batch = []
规则 14:用 Parquet / Native 格式
-- 从 Parquet 导入(最快)
INSERT INTO events
SELECT * FROM s3('https://bucket/data/*.parquet', 'Parquet')
-- 从 CSV(最慢)
INSERT INTO events
SELECT * FROM file('data.csv', 'CSV', 'id UInt64, name String')
规则 15:异步小写入合并
-- 启用 async_insert
SETTINGS async_insert = 1,
async_insert_max_data_size = 10485760, -- 10MB
wait_for_async_insert = 0
规则 16:不要 UPDATE / DELETE
-- ❌ BAD: mutation,慢
ALTER TABLE events DELETE WHERE event_date < '2025-01-01'
-- ✅ GOOD: 用 TTL 自动清理
ALTER TABLE events MODIFY TTL event_date + INTERVAL 2 YEAR
规则 17:避免高基数字典
-- ❌ BAD: 100 万种 user_id
ORDER BY (user_id)
-- ✅ GOOD: 哈希取模分桶
ORDER BY (cityHash64(user_id) % 16, user_id)
2.4 性能 Settings 速查
-- 大查询:增加内存
SETTINGS max_memory_usage = 20000000000 -- 20GB
max_threads = 16
max_block_size = 100000
-- 实时查询:低延迟
SETTINGS max_execution_time = 30
timeout_before_checking_execution_speed = 1
-- 批量加载
SETTINGS max_insert_block_size = 1048576
input_format_parallel_parsing = 1
三、Agent 集成(来自 ClickHouse 官方 MCP)
3.1 ClickHouse MCP Server
// .mcp.json
{
"mcpServers": {
"clickhouse": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-clickhouse"],
"env": {
"CLICKHOUSE_URL": "http://localhost:8123",
"CLICKHOUSE_USER": "default",
"CLICKHOUSE_PASSWORD": "${CLICKHOUSE_PASSWORD}",
"CLICKHOUSE_DATABASE": "analytics"
}
}
}
}
3.2 Skill 引导 Claude 安全操作
Step 1:先探索 schema
用 clickhouse-io Skill,列出 analytics 数据库所有表,
并展示每个表的列、engine、partition 策略。
Step 2:先小查询试水
查询前 100 行 events 表,验证 schema 假设。
Step 3:渐进式深入
统计 events 表的行数、磁盘大小、压缩比。
Step 4:避免无界扫描
禁止:SELECT count() FROM events
允许:SELECT count() FROM events
WHERE event_date = today()
3.3 28 条 Agent 安全规则
# SKILL.md 中强制规则
1. 必须先 LIMIT 探索,再大查询
2. 禁止 SELECT count() 全表
3. 禁止无 WHERE 的 SELECT
4. 禁止 mutation(DELETE/UPDATE)
5. 必须用参数化查询,防止注入
6. 禁止生产环境执行 DDL
7. 大查询必须 EXPLAIN
8. 写入前先验证 schema
9. 重要操作前 SHOW CREATE TABLE
10. 监控 query_log 看慢查询
...
四、完整工作流示例
4.1 场景:优化慢查询
[用户] 这个查询跑了 30 秒:
SELECT count() FROM events
WHERE event_date >= '2026-01-01'
AND tenant_id = 123
[Skill 引导 Claude 思考]
1. 查 schema:SHOW CREATE TABLE events
2. 检查 ORDER BY 是否有 (tenant_id, event_date)
3. 检查分区策略
4. 检查表大小、压缩率
5. 检查系统表:system.query_log
[Skill 输出修复方案]
- 增加 ORDER BY (tenant_id, event_date)
- 增加 SETTINGS 优化
- 考虑用物化视图
4.2 场景:设计新表
[用户] 我要存用户点击事件,预计每天 1 亿条,保留 2 年。
[要求] 按 user_id 查询快,按时间范围查询快。
[Skill 输出]
```sql
CREATE TABLE user_clicks (
event_date Date,
event_time DateTime,
user_id UInt64,
session_id UUID,
event_type LowCardinality(String),
page_path String,
referrer String,
user_agent String,
ip_address IPv4,
country LowCardinality(FixedString(2)),
device_type LowCardinality(String),
payload JSON
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(event_date)
ORDER BY (user_id, event_date, event_time)
SETTINGS index_granularity = 8192;
[解释]
- 1 亿条/天 → 每月 30 亿条 → 24 月 720 亿条
- 分区按月,避免过度碎片
- ORDER BY 把 user_id 放第一,按用户查快
- 时间和事件类型走 secondary index
### 4.3 场景:从 Kafka 实时导入
```sql
CREATE TABLE events_kafka (
event_time DateTime,
user_id UInt64,
payload String
)
ENGINE = Kafka
SETTINGS kafka_broker_list = 'kafka:9092',
kafka_topic_list = 'events',
kafka_group_name = 'clickhouse-consumer',
kafka_format = 'JSONEachRow';
-- Materialized View 转换并写入 MergeTree
CREATE MATERIALIZED VIEW events_mv TO events AS
SELECT
toDate(event_time) AS event_date,
event_time,
user_id,
payload
FROM events_kafka;
五、真实踩坑案例
案例 1:Nullable 列导致查询慢 10 倍
现象:SELECT count(*) FROM t WHERE a IS NULL 跑了 60 秒。
根因:Nullable 列内部有额外的 null 标志位 + 索引膨胀。
解决:去掉 Nullable,用默认值。
案例 2:过度分区(10 万个 partition)
现象:merge 永远追不上,磁盘爆。 根因:按 user_id 分区。 解决:改按月分区 + ORDER BY (user_id)。
案例 3:FINAL 关键字滥用
现象:用 ReplacingMergeTree 但查询时全加 FINAL,慢到无法用。
根因:FINAL 强制后台 merge 完成。
解决:用 ORDER BY ... LIMIT 1 BY user_id。
案例 4:JOIN 顺序反了
现象:大表在前,小表在后,跑了 1 小时。
根因:ClickHouse 不会自动优化 JOIN 顺序。
解决:小表在前,或显式用 ASOF / SEMI JOIN。
案例 5:异步插入丢数据
现象:async_insert 启用后,崩溃时丢失 1 分钟数据。
根因:wait_for_async_insert = 0 立即返回,buffer 在 OS cache。
解决:wait_for_async_insert = 1 同步等待。
案例 6:Materialized View 卡住
现象:MV 不更新数据。 根因:source Kafka 表暂停消费。 解决:检查 Kafka 消费进度,必要时重启。
案例 7:Distributed 表查询慢
现象:跨分片查询比单分片慢 5 倍。 根因:数据分布不均(个别分片热点)。 解决:检查 system.distribution_queue,重新分片。
案例 8:JSON 字段查询慢
现象:WHERE payload.country = 'US' 慢。
根因:JSON 字段没有索引。
解决:在 schema 阶段显式拆字段,或用 JSONAllPathsWithTypes 索引。
案例 9:冷热数据没分离
现象:查询近 7 天数据慢。 根因:老数据在冷盘(HDD),新数据在热盘(SSD)。 解决:用 storage_policy 分层存储。
案例 10:TTL 设置错误
现象:TTL 到期后查询仍能查到。
根因:TTL 删除是异步的(后台 merge 时才删)。
解决:强制 ALTER TABLE … MATERIALIZE TTL,或改用 DELETE WHERE。
六、性能基准
6.1 扫描速度(来自 ClickHouse 官方 benchmark)
| 数据量 | MergeTree | MySQL InnoDB | PostgreSQL |
|---|---|---|---|
| 1 亿行简单计数 | 0.05s | 12s | 18s |
| 10 亿行 group by | 0.5s | 300s+ | 600s+ |
| 1 亿行 JOIN | 0.8s | 60s | 90s |
| 1 亿行 ORDER BY | 0.3s | 30s | 45s |
6.2 压缩比
| 数据类型 | 原始 | ClickHouse 压缩 | 比例 |
|---|---|---|---|
| 事件日志 JSON | 100 GB | 8 GB | 12.5x |
| 指标(Float64) | 50 GB | 3 GB | 16.7x |
| 网页(String) | 200 GB | 30 GB | 6.7x |
6.3 写入吞吐
| 方式 | 吞吐(rows/sec) |
|---|---|
| 单行 INSERT | 1,000 |
| 批量 1 万行 INSERT | 500,000 |
| Parquet from S3 | 5,000,000 |
| Kafka 消费 | 1,000,000 |
七、Q&A
Q: 必须用 ClickHouse Cloud 吗? A: 不必须。开源版本功能一样;Cloud 节省运维。
Q: 跟 Postgres 比? A: ClickHouse = OLAP(分析);Postgres = OLTP(事务)。不要混用。
Q: 跟 Snowflake / BigQuery 比? A: 性能相当,价格便宜 5-10 倍。ClickHouse 自部署。
Q: 必须用 SSD 吗? A: 强烈建议。HDD 上性能差 5-10 倍。
Q: 实时性如何? A: 毫秒级 INSERT,秒级可查询。
Q: 支持事务吗? A: 不支持 ACID 事务。只支持原子单 INSERT。
Q: 跟 Doris / StarRocks 比? A: 性能相当,但 ClickHouse 社区更大、文档更全、Cloud 部署更简单。
Q: 中文支持? A: 完全 UTF-8 支持,中文无障碍。
八、Q&A 实战相关
Q: 触发 Skill 后 Claude 怎么行动? A: SKILL.md 引导:先探索 schema → 小查询验证 → 大查询 → 输出 EXPLAIN → 给出建议。
Q: 误操作危险吗? A: 高。Skill 强制禁止无 WHERE 查询、禁止 mutation、禁止生产环境 DDL。
Q: 能自托管吗? A: 可以。Docker / deb / rpm 都支持。
Q: 学习曲线? A: 中等。懂 SQL 即可上手,深度优化需理解 MergeTree。
Q: 跟 Snowflake 集成? A: 通过 S3 / Iceberg / JDBC 互通。
Q: License? A: 核心是 Apache 2.0,ClickHouse Cloud 商业版。
Q: 跟 ClickHouse 官方文档关系? A: Skill 是文档的浓缩 + AI 友好版本,文档是权威参考。
九、5 条反合理化
| 借口 | 反驳 |
|---|---|
| ”Postgres 也存日志” | 1 亿行+ 用 Postgres 会慢 100 倍 |
| ”我用 FINAL 保证去重” | FINAL 是性能杀手 |
| ”分区越多越好” | 高基数分区会失控 |
| ”NULL 字段省事” | Nullable 列性能损失 30%+ |
| “实时性不重要” | ClickHouse 秒级查询是最大优势 |
十、5 条实战技巧
- 从 system.query_log 入手:找慢查询
- EXPLAIN PIPELINE 调试:看执行计划
- **避免 SELECT ***:用显式列
- TTL + 冷热分层:节省 50% 成本
- Materialized View 预聚合:把 1 秒查询变 50ms
十一、安装
# Claude Code
/plugin marketplace add affaan-m/everything-claude-code
/plugin install everything-claude-code@everything-claude-code
cp -r everything-claude-code/rules/common ~/.claude/rules/
# ClickHouse MCP(推荐)
claude mcp add clickhouse npx @modelcontextprotocol/server-clickhouse
# 通用
npx skills add affaan-m/everything-claude-code --skill clickhouse-io
十二、总结
核心价值:
- ClickHouse 专属最佳实践
- 31 条原子规则 + Agent 安全集成
- 避免通用 SQL 提示词给 ClickHouse 错误建议
- 性能调优 + 写入策略 + Schema 设计全覆盖
适用人群:
- 数据工程师
- 实时分析团队
- 大数据 ETL 工程师
- SaaS 监控 / 指标平台
投入产出比:⭐⭐⭐⭐(4/5)—— OLAP 项目必装。
何时不要用:
- 事务型业务(用 Postgres)
- 极小数据量
- 强一致场景
- 没用过 ClickHouse(先看官方文档)
配套文档:postgres-patterns 关系型 | backend-patterns 后端 | verification-loop 验证
参考资料
快速安装
git clone https://github.com/affaan-m/everything-claude-code.git
ln -sf "$(pwd)/everything-claude-code/skills/clickhouse-io" \
~/.claude/skills/clickhouse-io