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

如何保证一个请求在 200ms 内完成

  •  
  •   SelectLanguage · 2020-08-20 00:26:13 +08:00 · 4191 次点击
    这是一个创建于 1558 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我发现查询一张表单独根据 id 条件查询大概要 0.04~0.05 秒 这样如果一个请求需要执行超过 5 个 sql 语句就能很难达到要求了 不知道有没有什么好办法,一个 sql 语句 0.05 秒是太慢了吗?

    20 条回复    2020-08-20 10:01:21 +08:00
    wellsc
        1
    wellsc  
       2020-08-20 00:31:26 +08:00
    具体情况具体分析
    Jooooooooo
        2
    Jooooooooo  
       2020-08-20 00:34:20 +08:00
    多个线程并发请求

    这种 io 是主要瓶颈的逻辑尽可能搞起并发
    isukkaw
        3
    isukkaw  
       2020-08-20 00:58:38 +08:00
    50ms 这个量级其实很微妙。

    该缓存缓存,该并发并发。
    hronro
        4
    hronro  
       2020-08-20 01:00:25 +08:00
    5 个 SQL 能否并行查询,还是之间有依赖关系?是否用了 ORM 之类的东西可能拖慢查询速度?
    jiahonzheng
        5
    jiahonzheng  
       2020-08-20 01:54:34 +08:00
    1. 看业务,如果可以缓存,那就上缓存
    js8510
        6
    js8510  
       2020-08-20 05:13:48 +08:00
    sharding. cache. 看看设计能不能提高并发 单一服务能不能拆分然后 fan out 等等等。。 你这个问题太宽泛了。
    nvkou
        7
    nvkou  
       2020-08-20 05:27:30 +08:00 via Android
    说实话 200 毫秒应该要被考虑到网络波动的量级。要保证 200 不只是数据库问题
    fengchang
        8
    fengchang  
       2020-08-20 06:43:59 +08:00
    查询一张表单独根据 id 条件查询大概要 0.04~0.05 秒

    ----

    根据 id 查询 50ms 是有点慢了,但是不知道你的数据库具体情况

    ID 是主键吗?
    硬盘上 SSD 了吗?
    列是不是太多了,所有列都是必要的吗?
    opengps
        9
    opengps  
       2020-08-20 06:59:26 +08:00 via Android
    提高硬盘速度
    优化 sql
    并发提升其实不一定大
    kaiki
        10
    kaiki  
       2020-08-20 07:40:58 +08:00
    不知道实际情况不好给建议,不过能优化的大概也就是查询这块了,提前准备好缓存数据把查询省掉的话,能快很多。
    594duck
        11
    594duck  
       2020-08-20 08:14:03 +08:00   ❤️ 2
    我们问题要一个一个的讲
    首先 200ms 这个死线是怎么来的,你监控自己的 API 响应的时候,要区分出 request 和 proxy 的流量,然后要把流量分成 97%,95%,80%,50%,20%.只要 request r95%是小于 200ms 就 OK

    第二,关于 SQL 语句,我们也要具体问题具体看,首先,你的 SQL 表有多少行,什么配置,查询一次 40ms 是为什么,他是不是必须这么慢,比如 OLAP 的就这么慢是说的过去的大不了改为异步。但是如果是 OLTP 的数据库,理论上每一个请求必须在 10ms 内完成。具体你要说一下你的架构,数据库配置,数据库最慢的表是什么表,是不是有 cache,有没有读写分离。
    594duck
        12
    594duck  
       2020-08-20 08:15:36 +08:00
    数据库最慢的表有多少行,存的字段是什么样的,一次读取的量大概有多大。

    你查一次 40ms,那要扫描多少行,遍历 多少行
    594duck
        13
    594duck  
       2020-08-20 08:17:08 +08:00
    不是很认同上手叫你上什么 SSD,加 IO 硬盘的,属于不懂 RCA 分析法的选手
    ericls
        14
    ericls  
       2020-08-20 08:18:30 +08:00 via iPhone
    不结合业务讨论意义不大 如果你要不惜一切代价的话 拆分成多个请求 总体速度会降低 但是单个请求会快 你愿意吗? 还有个好处 看上去的并发性能会好一些
    wangritian
        15
    wangritian  
       2020-08-20 09:36:55 +08:00
    主键查询几十毫秒真的慢了,先在服务器 ping 一下数据库或是用命令行查询看看时间,然后看看数据库的负载是不是太高,另外你做长连接了吗
    la2la
        16
    la2la  
       2020-08-20 09:46:35 +08:00
    网络延迟,数据库 IO,业务逻辑这个三个方面看看哪方面是瓶颈,在针对性的优化。不过一般我碰到的大部分都是数据库 SQL 执行问题
    binbinyouliiii
        17
    binbinyouliiii  
       2020-08-20 09:49:12 +08:00
    200 毫秒对于前端感知来说还好,比如你用阿里云的控制面板,超过 200ms 是经常的事情
    KarlChen2015
        18
    KarlChen2015  
       2020-08-20 09:56:10 +08:00
    主键查询 1ms 足矣
    我这是 200 万记录的表
    zppass
        19
    zppass  
       2020-08-20 10:01:06 +08:00
    一般来说几百毫秒还能接受,但是你这 5 个查询,首先要考虑有些不怎么会变的,是不是可以考虑用 redis 存起来,另外优化 SQL,不要出现循环里面套 SQL 的情况。还有就是主键查询,其实蛮快的,考虑一下楼上老哥们的说法排查。
    至于并发,实际上你这个请求结果,用户不需要即时感应的话,其实异步多线程就可以了。比如说生成一个人工订单不能马上反馈那种,没必要把东西都搞完再返回。
    Yano
        20
    Yano  
       2020-08-20 10:01:21 +08:00
    如果数据库不经常变动,感觉可以缓存起来,不过根据主键 id 查询的应该很快。同时 sql 只查询必要字段,不用把所有列都返回
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6012 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:08 · PVG 11:08 · LAX 19:08 · JFK 22:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.