阿飞
阿飞
发布于 2025-09-25 / 2 阅读
0
0

ClickHouse性能测试完整示例

本文是一个 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. 常用性能优化技巧(测试时可对比)

  1. 批量插入:一次 INSERT 多行,而不是多次插入

  2. 选择合适的 ORDER BY:把常用过滤字段放到排序键前面

  3. LowCardinality:对低基数字符串字段(如城市名)压缩存储

  4. 分区裁剪:按时间分区可大幅减少扫描数据量

  5. 并行查询:可用 SET max_threads = N 控制并行线程数


评论