记录一次sql的变通

需求:查询当天最高烟雾的前三名

遇到的问题:

首先看sql和结果:
SELECT 
     a.sensor_number as  sensorNumber,
     a.s_port as sPort,
     a.sync_time as syncTime,
     b.address as address
   from interface_data_list a FORCE INDEX(index_sync_time)
    STRAIGHT_JOIN interface_list b ON a.sensor_number=b.sensor_number
    STRAIGHT_JOIN user_project c ON b.project_list_id=c.project_list_id
   WHERE  c.user_id=27
    AND a.sync_time > CURDATE()
     ORDER BY sPort DESC

在这里插入图片描述
在这里插入图片描述
1.首先我是通过mysql将当天的所有烟雾数据查出来,数据多。
2.然后在后台进行去重复,
3.再根据时间字段排序,
4.得到想要的数据,效率很低,
5.指定数据格式时,for循环遍历的次数也增加,速度慢。

通过优化如下:

首先我们从sql入手,只要sql一次性查出前三名,我们就只需取三条数据,并且在后台也不需要去重了,
通过优化sql 如下:
SELECT  h.sensorNumber AS sensorNumber,
				h.tPort AS tPort,
                h.syncTime AS syncTime,
			    h.address AS address
FROM(
SELECT 
     a.sensor_number as  sensorNumber,
     a.t_port as tPort,
     a.sync_time as syncTime,
     b.address as address
   from interface_data_list a FORCE INDEX(index_sync_time)
        STRAIGHT_JOIN interface_list b ON a.sensor_number=b.sensor_number
		STRAIGHT_JOIN district e ON b.d_id=e.d_id
        STRAIGHT_JOIN user_project c ON b.project_list_id=c.project_list_id
   WHERE  c.user_id=27
    AND a.sync_time > CURDATE()
     ORDER BY tPort DESC LIMIT 1000000
)h GROUP BY h.sensorNumber ORDER BY h.tPort DESC LIMIT 3;

在这里插入图片描述

优化后,后台直接拿到数据进行循环调整想要的数据格式,最多也只循环三次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渡生远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值