美文网首页
菠菜网站-线上出现UPDATE超时

菠菜网站-线上出现UPDATE超时

作者: 耳威巴帝 | 来源:发表于2018-12-10 11:35 被阅读0次

    在菠菜的正式环境中,需求如下:
    1,菠菜后台存在14个定时器,分别以30秒,10秒的的时间间隔去爬取别人网站的数据。
    2,在爬取到别人网站数据后,需要更新爬取到的数据所有之前的数据,将状态改变

    SQL:这里SQL是直接UPDATE IN的方式

    UPDATE
          bocai_user_periods_relation
          SET
          STATUS = 3
          WHERE periods_id IN
          (SELECT
          id
          FROM
          bocai_periods
          WHERE periods  <=  '20181111'
          AND bocai_type_id = 1
          AND DATE(open_prizetime) = CURDATE())
          and user_id = 4
    

    问题描述:
    1,通过后台日志查到,每一次所有爬虫同时执行时,会导致服务器的CPU高达130%,并且内存也很增高,
    细看日志发现是因为MYSQL数据库导致,而因为MYSQL导致CPU过高,从而是整个项目访问会顿住,并且数据库访问会顿住,查看日志发现后面执行的SQL因为使用了druid全部报超时错误:

    slow sql 1189 millis
    下面是上面代码块的SQL
    

    并且你升高超时时间,同样还是超时

    slow sql 5189 millis
    下面是上面代码块的SQL
    

    问题解决步骤:
    1,将SQL提出,通过EXPLAIN执行SQL发现,使用UPDATE IN是全表搜索,type的级别是index,rows是全表(这里有一个问题,rows并不是全表,少了几条数据)
    2,然后通过网上查询,UPDATE语句如果where条件的数据大于20%-30%还是会使用全表搜索,但是我使用了IN查询后无论where大于小于20%-30%还是会全表搜索
    3,但是我直接使用数据字段查询结果就不同了,直接使用update table set a = 1 where id in (1,2,3,4)这样的UPDATE是索引处理
    4,修改代码,先通过SQL查询出IN查询里面的LIST,然后在UPDATE,解决了问题。

    相关文章

      网友评论

          本文标题:菠菜网站-线上出现UPDATE超时

          本文链接:https://www.haomeiwen.com/subject/vnfrhqtx.html