今天上午十点后,公众号服务器突然崩溃,查询日志发现,是由于一条查询语句超时,导致CPU使用率飙升到80+,
下面记录下问题,及解决方案,
SELECT * from hb
WHERE progress = 'A'
AND hb_whether_big = 0
AND platfrom = 'meituan'
ORDER BY which_is_big - current_num
LIMIT 1;
这条SELECT语句,主要是ORDER BY子句中的which_is_big - current_num
,导致了查询速度缓慢,其次没有及时把过期的记录(红包)排除在外,再加上上午的高峰期,引起了这次故障的发生.
故障发生后,
首先将定时执行的job表中的未执行的数据进行了清空,稍微减轻服务器负担,避免网站挂掉,然后查阅日志,迅速定位到故障位置后,暂时先将ORDER BY子句删除(短期去除对业务影响不大),服务暂时恢复正常,最后对语句先后进行如下优化:
## 分别排序会先对第一个字段进行排序,排好后,在其基础上,再对第二个字段进行排序
## 这样执行效率虽然可以接受,但是和最初的字段相减的逻辑有出入
SELECT * from hb
WHERE progress = 'A'
AND hb_whether_big = 0
AND platfrom = 'meituan'
ORDER BY which_is_big, current_num DESC
LIMIT 1;
最后采用了下面这种写法
## 先将计算结果查询出来,临时命名一个d_value字段表示差值,然后对这个字段进行排序,达到了和最初逻辑一样的效果
## 并且新加入了一个ctime将数据范围限制在了一周内
SELECT *,(which_is_big - current_num) as d_value
FROM hb
WHERE progress = 'A'
AND hb_whether_big = 0
AND platfrom = 'meituan'
AND ctime>''
ORDER BY d_value
LIMIT 1;
网友评论