一个ORDER BY引发的服务器崩溃

今天上午十点后,公众号服务器突然崩溃,查询日志发现,是由于一条查询语句超时,导致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; 

你可能感兴趣的:(一个ORDER BY引发的服务器崩溃)