惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
博客园 - 叶小钗
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
Last Week in AI
Last Week in AI
罗磊的独立博客
量子位
Jina AI
Jina AI
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
美团技术团队
雷峰网
雷峰网
爱范儿
爱范儿
S
SegmentFault 最新的问题
小众软件
小众软件
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

郑文峰的博客

使用dify对接飞书多维表格 使用n8n对接飞书多维表格 服务启动时出现 OOM 一次服务升级时pg表DDL执行超时失败 Go语言高效IO缓冲技术详解 Go语言延迟初始化(Lazy Initialization)最佳实践 Go语言字符串拼接性能对比与优化指南 Go语言结构体内存对齐完全指南 Go语言空结构体:零内存消耗的高效编程 Go语言堆栈分配与逃逸分析深度解析 Go语言原子操作完全指南 Go语言内存预分配完全指南 Go语言不可变数据共享:无锁并发编程实践 Go语言零拷贝技术完全指南 Go语言遍历性能深度解析:从原理到优化实践 Go语言Interface Boxing原理与性能优化指南 Go协程池深度解析:原理、实现与最佳实践 使用etcd分布式锁导致的协程泄露与死锁问题 基于pre-commit的Python代码规范落地实践 初识 MCP Server pulsar阻塞导致logstash无法接入日志 django-prometheus使用及源码分析 kube-proxy源码分析 kubernetes service如何通过iptables转发 tcp缓存引起的日志丢失 django-apschedule定时任务异常停止 理解calico容器网络通信方案原理 理解flannel的三种容器网络方案原理 理解Linux IPIP隧道 理解VXLAN网络
count的性能优化
zhengwenfeng · 2022-08-10 · via 郑文峰的博客

# 问题

今天测试给我提了BUG,发现某个查询接口超时了,超时时间为1分钟。

目前的用的数据库是clickhouse,数据量大概在20亿左右

# 定位问题

我通过调试将查询数据的语句打印出来,查询语句放在数据库中执行,发现几秒就查询完成了,这个时候我就奇了怪了,后面我再仔细看接口的代码,跟踪调试后发现,除了会查询数据之外,还会执行查询数据量的语句。

我将查询数量的语句打印出来,执行该语句,发现是超过1分钟的,看来是定位到问题了。

# 查询分析

语句大概是下面这样的,大概有30多张表,也就是需要union30多张表

select
    count(*)
from
    (
        select
            a_field,
            b_field,
            c_field,
            d_field,
            e_field,
            f_field
        from
            A
        union
        all
        select
            a_field,
            b_field,
            c_field,
            d_field,
            e_field,
            f_field
        from
            B
    )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

这条语句是通过将多个表union成一个大表,然后再count求数量。

问题显而易见,为啥我们要构造一张这么大的表在内存中再count数量,直接count每张表的数量再相加不就是了。优化语句如下:

select
    count(cnt)
from
    (
        select
            count() as cnt
        from
            A
        union
        all
        select
            count() as cnt
        from
            B
    )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

将该语句放在数据库查询,秒级返回,直接从1分钟优化到1秒钟