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

2018-12-10  本文已影响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,解决了问题。

上一篇 下一篇

猜你喜欢

热点阅读