这是《ClickHouse 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。
连接与查看
clickhouse-client --host ch-01 --port 9000 --user default
curl 'http://ch-01:8123/?query=SELECT%201'
SELECT version();
SHOW DATABASES;
SHOW TABLES FROM analytics;
DESCRIBE TABLE analytics.events_local;
SHOW CREATE TABLE analytics.events_local;
建表模板
CREATE TABLE analytics.events_local
(
event_date Date,
event_time DateTime,
event_id String,
user_id UInt64,
event_type LowCardinality(String),
city_id UInt32,
amount Decimal64(2)
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, event_type, city_id, user_id)
TTL event_date + INTERVAL 13 MONTH;
常用引擎
| 引擎 | 语义 |
|---|---|
| MergeTree | 通用明细 |
| ReplacingMergeTree | 按排序键和版本替换 |
| SummingMergeTree | 数值列求和 |
| CollapsingMergeTree | sign 抵消 |
| VersionedCollapsingMergeTree | 版本化抵消 |
| ReplicatedMergeTree | 副本 |
| Distributed | 分片入口 |
| Kafka | 消息消费 |
| Memory | 内存临时表 |
最新状态查询
SELECT
order_id,
argMax(order_status, version) AS status,
argMax(amount, version) AS amount,
max(updated_at) AS updated_at
FROM analytics.orders_local
GROUP BY order_id;
写入
clickhouse-client --query "INSERT INTO analytics.events_local FORMAT JSONEachRow" < events.jsonl
clickhouse-client --query "INSERT INTO analytics.events_local FORMAT CSVWithNames" < events.csv
clickhouse-client --query "INSERT INTO analytics.events_local FORMAT Parquet" < events.parquet
推荐写入:
单批 1 万到 10 万行
间隔数百毫秒到数秒
固定并发
失败重试并死信
查询优化
SELECT
query_id,
query,
query_duration_ms,
read_rows,
read_bytes,
memory_usage
FROM system.query_log
WHERE type = 'QueryFinish'
ORDER BY query_duration_ms DESC
LIMIT 30;
检查顺序:
分区条件
排序键前缀
读取列
过滤条件
聚合基数
JOIN 大小
资源限制
运行中查询
SELECT query_id, elapsed, read_rows, memory_usage, query
FROM system.processes
ORDER BY elapsed DESC;
KILL QUERY WHERE query_id = 'target-query-id';
part 与合并
SELECT table, partition, count() AS parts, sum(rows) AS rows
FROM system.parts
WHERE active
GROUP BY table, partition
ORDER BY parts DESC;
SELECT database, table, elapsed, num_parts
FROM system.merges;
副本状态
SELECT
database,
table,
replica_name,
is_readonly,
queue_size,
absolute_delay
FROM system.replicas;
集群与磁盘
SELECT cluster, shard_num, replica_num, host_name, is_local
FROM system.clusters;
SELECT name, path, total_space, free_space
FROM system.disks
ORDER BY free_space;
Kafka 消费
SELECT database, table, consumer_id, assignments.topic
FROM system.kafka_consumers;
SYSTEM STOP CONSUMERS analytics.kafka_events;
SYSTEM START CONSUMERS analytics.kafka_events;
权限
CREATE ROLE analyst_ro;
GRANT SELECT ON analytics.* TO analyst_ro;
CREATE USER analyst IDENTIFIED BY 'strong-password';
GRANT analyst_ro TO analyst;
常见错误
| 错误 | 方向 |
|---|---|
| Too many parts | 小写入、分区过多、合并慢 |
| MEMORY_LIMIT_EXCEEDED | 高基数聚合、大 JOIN、扫描过大 |
| Disk space insufficient | TTL、扩容、停写 |
| Replica is readonly | Keeper、元数据、恢复状态 |
| Timeout | 查询成本、资源争抢 |
| DNS error | 域名、网络、远程节点 |
本章小结
本速查手册汇总连接、建表、写入、查询、运维和排障的常用命令。生产使用时要以当前版本文档为准,并把团队常用 SQL 固化到运维平台中。