分组查询 mysql_mysql分组查询

需求:分组查询每个设备今天发上来时间最近的监控求助。

备注:不知道服务器安装的mysql是什么版本的,居然子查询超慢,从12000多条记录中筛选居然耗时300s

0818b9ca8b590ca3270a3433284dd417.png

一般的查询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可以看出,查询能一步到位的就不要再重复做同样的事情,这样效率才能提高。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值