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

PostgreSQL 分页查询 CPU 吃满的问题

  •  
  •   Uyuhz · 2021-08-25 11:13:39 +08:00 · 3250 次点击
    这是一个创建于 1188 天前的主题,其中的信息可能已经有所发展或是发生改变。

    疑问

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