记录clickhouse记录一次性能优化,从60s到1s

文章目录

问题

一个查询接口,涉及多个clickhouse 查询,查询用时一下变成要60s

表结构类似如下
bash 复制代码
CREATE TABLE  demo.test_local
(
    `id` UUID,
    `date` DateTime,
    `type` String
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test_local', '{replica}')
PARTITION BY data_date
ORDER BY id
TTL data_date + toIntervalDay(10)
SETTINGS index_granularity = 8192
分析第一步

从资源竞争入手,因为这里面一个接口很多个查询

通过执行SHOW PROCESSLIST 命令,得到执行详情

这里我得到的数据

CPU 竞争 :OSCPUWaitMicroseconds 高达 2.5 亿微秒(~250秒),说明 CPU 调度延迟严重。

磁盘 I/O 瓶颈 :ThreadPoolReaderPageCacheMiss 高(如 5,737 次缓存未命中),AsynchronousReadWaitMicroseconds 超过 4.5 亿微秒(~453秒),表明磁盘读取成为瓶颈

可以得到的结论,cpu 等待时间长,磁盘读的数据量大

调整第一步

增量cpu资源,调到48c

执行时间变成30s

观察多磁盘读

从执行sql来看,都有时间条件作为下推来过滤数据,好像没生效

观察create table sql

发现 排序竟然是用的id,不是date,这里本来应该是用date的

bash 复制代码
CREATE TABLE  demo.test_local
(
    `id` UUID,
    `date` DateTime,
    `type` String
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test_local', '{replica}')
PARTITION BY data_date
ORDER BY id
TTL data_date + toIntervalDay(10)
SETTINGS index_granularity = 8192

修改create table sql 接口时间变成5s左右

bash 复制代码
CREATE TABLE  demo.test_local
(
    `id` UUID,
    `date` DateTime,
    `type` String
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test_local', '{replica}')
PARTITION BY data_date
ORDER BY date
TTL data_date + toIntervalDay(10)
SETTINGS index_granularity = 8192
继续观察sql

发现有很多基于type 的精确查询

bash 复制代码
CREATE TABLE  demo.test_local
(
    `id` UUID,
    `date` DateTime,
    `type` String
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test_local', '{replica}')
PARTITION BY data_date
ORDER BY (date,type)
TTL data_date + toIntervalDay(10)
SETTINGS index_granularity = 8192

再次修改create table sql ,把type 加入排序建

对type增加跳数索引

ALTER TABLE demo.test_local

ADD INDEX type_set_index (type) TYPE set(100) GRANULARITY 8;

结果接口耗时1s

相关推荐
yume_sibai15 分钟前
06-Rust Web 开发实战(Axum 框架 + 数据库 + JWT 认证 + 中间件 + 部署)
前端·数据库·rust
计算机魔术师2 小时前
特朗普上台打给黄仁勋:AI末日论是骗局,我们绝不让它发生
前端
troy1282 小时前
Python 基础语法(八):Web 后端开发、数据分析与可视化、网络爬虫、人工智能 / 大模型应用
前端·python·数据分析
计算机魔术师2 小时前
CEO说要慢下来,黑客说别做梦了——同一篇论文,两种命运
前端
kyriewen3 小时前
我花3天抓了一个幽灵bug,凶手藏在第4层
前端·javascript·程序员
IT_陈寒3 小时前
Java里用Stream.parallel()翻车实录,这性能还不如单线程
前端·人工智能·后端
wangchunyu1143 小时前
JavaScript 零基础入门教程
前端
hanchenxing4 小时前
前端异步任务三方案:Celery vs Redis Stream vs BullMQ 实战对比消息队列
前端·数据库·redis·异步任务·方案对比
默_笙4 小时前
⚓ AI 的"官方答题卡":withStructuredOutput 与结构化输出的终局之战
前端·javascript
掘金挖土4 小时前
前端手摸手跑路之 AI 应用开发(五)
前端·后端