在菠菜的正式环境中,需求如下:
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,解决了问题。
网友评论