V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Uyuhz
V2EX  ›  PostgreSQL

PostgreSQL 分页查询 CPU 吃满的问题

  •  
  •   Uyuhz · 2021 年 8 月 25 日 · 3697 次点击
    这是一个创建于 1614 天前的主题,其中的信息可能已经有所发展或是发生改变。

    疑问

    数据库服务器配置 20 核 32G,单机。100 并发持续时间 180 秒对某个简单分页查询接口进行压测。
    期间应用服务器正常,数据库连接正常,但数据库服务器 CPU 占满,请问这是正常现象还是啥问题....

    sql

    单表分页的首页查询,表内 1000 万数据,筛选出的数据为 28w,大概 sql 如下:

    SELECT a,b,c,d,e FROM table WHERE del_flag = 0 AND c LIKE 'c%' order by e desc limit 10
    
    SELECT COUNT(*) FROM table WHERE del_flag = 0 AND c LIKE 'c%'
    

    执行计划

    使用 pg_stat_statements 查看

    压测结果

    25 条回复    2022-03-05 20:17:05 +08:00
    zoharSoul
        1
    zoharSoul  
       2021 年 8 月 25 日
    大表不要 count
    Uyuhz
        2
    Uyuhz  
    OP
       2021 年 8 月 25 日
    @zoharSoul 业务需要,无可避免啊
    qinxi
        3
    qinxi  
       2021 年 8 月 25 日
    @Uyuhz #2 业务上可以缓存计数.
    qinxi
        4
    qinxi  
       2021 年 8 月 25 日
    @qinxi #3 完了.带 like..当我没说.查询条件多变的话缓存也救不了
    laozhoubuluo
        5
    laozhoubuluo  
       2021 年 8 月 25 日
    EXPLAIN 看下索引是否设置正确。
    另外如果业务经常使用 COUNT(*) ,建议把相关值放入内存缓存或者缓存表。
    laozhoubuluo
        6
    laozhoubuluo  
       2021 年 8 月 25 日
    @laozhoubuluo 带 LIKE 的话效率不太好优化了就。除非上一些比较复杂的优化,例如搜索数据全量进缓存后续读取靠缓存,以及单独的检索服务器之类的。
    Uyuhz
        7
    Uyuhz  
    OP
       2021 年 8 月 25 日
    @laozhoubuluo 查询条件多变的情况如何处理呢,这个值很难保证准确吧。。。
    laozhoubuluo
        8
    laozhoubuluo  
       2021 年 8 月 25 日
    @Uyuhz 加 gin 索引 & pg_trgm 模块是个可以尝试的办法。不过得分析下主要的查询方向交给 DBA 看看怎么加比较优化。
    Uyuhz
        9
    Uyuhz  
    OP
       2021 年 8 月 25 日
    @laozhoubuluo EXPLAIN 看 like 'c%' 是走了索引的,另外关键是没有 DBA....不然这活轮得到我吗....
    ColinZeb
        10
    ColinZeb  
       2021 年 8 月 25 日
    select a,b,c from t where id in (select id from t limit)
    aragakiyuii
        11
    aragakiyuii  
       2021 年 8 月 25 日 via iPhone
    VACUUM 之后再试试?
    aragakiyuii
        12
    aragakiyuii  
       2021 年 8 月 25 日 via iPhone
    vacuum analyze tablename
    Uyuhz
        13
    Uyuhz  
    OP
       2021 年 8 月 25 日
    @aragakiyuii 尝试了下 吞吐量到了 108,估计是误差,cpu 未见效果
    netnr
        14
    netnr  
       2021 年 8 月 25 日 via Android
    新版本 索引 有优化
    借一部说话
    pgsql 不(傻瓜)支持忽略大小写查询,业务开展有困扰吗,其它几个关系型数据库都支持
    oracle mssql mysql 起步 300M,而 pgsql 只需要 30M,而且性能测评还占上风,对于个站小🐔部署优势巨大,就卡在大小写查询的问题(用 EFCore)
    zjp
        15
    zjp  
       2021 年 8 月 25 日
    @netnr 我选 citext 类型
    liuxu
        16
    liuxu  
       2021 年 8 月 25 日
    mysql 没命中索引的时候 cpu 消耗相当高
    liuxu
        17
    liuxu  
       2021 年 8 月 25 日
    @liuxu 关系型数据库都是
    littlewing
        18
    littlewing  
       2021 年 8 月 25 日
    上 es
    dorothyREN
        19
    dorothyREN  
       2021 年 8 月 25 日
    @netnr #14 这个难道不是你的问题吗?
    aragakiyuii
        20
    aragakiyuii  
       2021 年 8 月 25 日 via iPhone
    @Uyuhz del_flag 和 c 都有索引嘛?
    Uyuhz
        21
    Uyuhz  
    OP
       2021 年 8 月 26 日
    @aragakiyuii 前者无,后者有
    aragakiyuii
        22
    aragakiyuii  
       2021 年 8 月 26 日
    Uyuhz
        23
    Uyuhz  
    OP
       2021 年 8 月 26 日
    @aragakiyuii 感谢,我先研究下
    bthulu
        24
    bthulu  
       2021 年 8 月 26 日
    可以指定慢 sql 使用某个 cpu 核心, 让这个核心慢慢跑就是了. 比如 8C16G, 打满一个核心, cpu 占用率也就 12.5%
    encro
        25
    encro  
       2022 年 3 月 5 日
    你都 like 了,还要什么性能。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   877 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 19:41 · PVG 03:41 · LAX 11:41 · JFK 14:41
    ♥ Do have faith in what you're doing.