需求:分组查询每个设备今天发上来时间最近的监控求助。
备注:不知道服务器安装的mysql是什么版本的,居然子查询超慢,从12000多条记录中筛选居然耗时300s
一般的查询SELECT * 也不超过两秒啊,这都源于自己平时不注重效率导致的,以此自诫!
1、一个相当耗时的子查询
SELECT * FROM monitor_help WHERE SERVICETIME IN ( SELECT
max(SERVICETIME) FROM monitor_help GROUP BY DEVICE_ID )
AND SERVICETIME BETWEEN '2012-11-19' AND '2012-11-20'
AND DOFLAG = 0 GROUP BY DEVICE_ID;
单看语句貌似没有多大的问题,但是一执行就会发现问题:在查询条件中经历了一个子查询和多个条件的过滤工作,每一次过滤都相当于一次查询操作,费事费力还不讨好,结果花了333.422s才完成查询,才三个设备啊,大囧。
这里反映出的问题是,当设备越来越多的时候时间会更长,所以这种分组是失败的!
2、着手优化查询语句
1)减少查询条件:
SELECT * FROM monitor_help WHERE SERVICETIME IN ( SELECT
max(SERVICETIME) FROM monitor_help WHERE DOFLAG = 0 AND
SERVICETIME BETWEEN '2012-11-19' AND '2012-11-20' GROUP BY
DEVICE_ID ) GROUP BY DEVICE_ID;
2)发现欠妥的地方:不同的设备可能服务的时间相同,原来一开始就错了。
3)建一个临时表查询:
SELECT * FROM (SELECT *
FROM monitor_help ORDER BY SERVICETIME DESC) TABLE_ WHERE DOFLAG=0
AND SERVICETIME BETWEEN '2012-11-19' AND '2012-11-20'
GROUP BY DEVICE_ID ORDER BY SERVICETIME DESC
查询时间:0.234s还可以接受。
3、考虑能不能再进一步优化
SELECT * FROM (SELECT * FROM monitor_help WHERE SERVICETIME
BETWEEN '2012-11-19' AND '2012-11-20' AND DOFLAG=0 ORDER BY
SERVICETIME DESC) TABLE_
GROUP BY DEVICE_ID ORDER BY SERVICETIME DESC;
查询时间:0.016s,这才是完美!
总结:从2-3)和3可以看出,查询能一步到位的就不要再重复做同样的事情,这样效率才能提高。