本文是一个 ClickHouse 性能测试完整示例,包括 环境准备 → 建表 → 造数 → 查询性能测试 的全过程。
这个流程你可以直接在本地 Docker 或生产服务器跑,方便测出 ClickHouse 在你的硬件环境下的速度。
1. 环境准备
Docker 快速启动
docker run -d --name clickhouse \\
-p 9000:9000 -p 8123:8123 \\
clickhouse/clickhouse-server
9000: TCP(客户端/JDBC)
8123: HTTP API
2. 连接到 ClickHouse
clickhouse-client -h 127.0.0.1 --port 9000
进入交互式命令行后,所有 SQL 都可以直接执行。
3. 建表(性能测试表)
使用 MergeTree 引擎,分区 + 排序键:
CREATE TABLE perf_test (
id UInt64,
name String,
age UInt8,
city LowCardinality(String),
score Float64,
event_time DateTime
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(event_time)
ORDER BY (event_time, id);
4. 造数(批量插入测试数据)
用 numbers() 生成器一次性生成 1亿行 测试数据:
INSERT INTO perf_test
SELECT
number AS id,
concat('name_', toString(number % 10000)) AS name,
rand() % 100 AS age,
concat('city_', toString(rand() % 1000)) AS city,
rand() % 10000 / 10 AS score,
now() - rand() % 86400 AS event_time
FROM numbers(100000000);
💡 这个插入可能需要几十秒,视硬件性能而定。
如果只是试试,可以把
100000000改成1000000(100万行)。
5. 查询性能测试
① 统计总行数
SELECT count() FROM perf_test;
② 按条件过滤统计
SELECT count()
FROM perf_test
WHERE age > 50 AND city = 'city_10';
③ 聚合计算
SELECT city, avg(score) AS avg_score
FROM perf_test
GROUP BY city
ORDER BY avg_score DESC
LIMIT 10;
④ 时间范围查询
SELECT count()
FROM perf_test
WHERE event_time >= now() - INTERVAL 1 HOUR;
6. 查询性能监控
ClickHouse 自带系统表,可以查看每次查询的耗时和扫描数据量:
SELECT
query,
read_rows,
read_bytes,
formatReadableSize(read_bytes) AS read_size,
query_duration_ms
FROM system.query_log
WHERE type = 'QueryFinish'
ORDER BY event_time DESC
LIMIT 5;
7. 常用性能优化技巧(测试时可对比)
批量插入:一次
INSERT多行,而不是多次插入选择合适的 ORDER BY:把常用过滤字段放到排序键前面
LowCardinality:对低基数字符串字段(如城市名)压缩存储
分区裁剪:按时间分区可大幅减少扫描数据量
并行查询:可用
SET max_threads = N控制并行线程数