Uyuhz

PostgreSQL 分页查询 CPU 吃满的问题

  •  
  •   Uyuhz · Aug 25, 2021 · 4496 views
    This topic created in 1904 days ago, the information mentioned may be changed or developed.

    疑问

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