ClickHouse指南
何时使用ClickHouse
✓ 适合
- 分析(数十亿行)
- 日志/事件聚合
- 实时数据看板
- 时序指标
✗ 不适合
- 频繁单行更新
- OLTP(事务)
- 复杂JOIN操作
- 低延迟点查询
MergeTree表示例
-- Web analytics events table
CREATE TABLE page_views
(
event_time DateTime,
date Date DEFAULT toDate(event_time),
user_id UInt64,
session_id String,
page_url LowCardinality(String), -- for low-cardinality strings
country LowCardinality(String),
device_type Enum8('desktop'=1, 'mobile'=2, 'tablet'=3),
duration_sec UInt16,
is_bounce UInt8
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(date) -- Monthly partitions
ORDER BY (date, page_url, user_id) -- Sort key (affects perf)
TTL date + INTERVAL 1 YEAR; -- Auto-delete after 1 year
高效聚合查询
-- Count unique users per page today (fast with bitmap)
SELECT
page_url,
uniqExact(user_id) AS unique_users,
countIf(is_bounce = 1) / count() AS bounce_rate,
avg(duration_sec) AS avg_duration
FROM page_views
WHERE date = today()
GROUP BY page_url
ORDER BY unique_users DESC
LIMIT 20;
-- Materialized view for pre-aggregation
CREATE MATERIALIZED VIEW daily_stats
ENGINE = SummingMergeTree()
ORDER BY (date, page_url)
AS SELECT date, page_url, count() AS views, uniq(user_id) AS users
FROM page_views GROUP BY date, page_url;