求助,多层嵌套foreach执行时间太长了,如何使用sql进行查询优化

1. 期望#

需要获取每个分区每分钟的温湿度数据,可能由于网络问题,某分钟时 1 分区有数据,2 没有

求助,多层嵌套foreach执行时间太长了,如何使用sql进行查询优化
用了一个比较笨的方法,查询所有分区的温湿度时,时间间隔是最多的,以所有分区的时间为准,然后进行循环,没有数据的就是 null

求助,多层嵌套foreach执行时间太长了,如何使用sql进行查询优化

求助,多层嵌套foreach执行时间太长了,如何使用sql进行查询优化

2. 您实际得到的结果?#

这样的耗时是处理 14401440+14401440+14401440+14401440 数据量的时间?
客户的服务器是 4 核 8G 的这个耗时太久了,直接 15 秒,公司服务器处理完是 4 秒多
求助,多层嵌套foreach执行时间太长了,如何使用sql进行查询优化

求助,多层嵌套foreach执行时间太长了,如何使用sql进行查询优化
这是前端显示的图表
求助,多层嵌套foreach执行时间太长了,如何使用sql进行查询优化
已经解决
感谢大佬 @renxiaotu 的解答
下图为处理过程
求助,多层嵌套foreach执行时间太长了,如何使用sql进行查询优化
这里是合并数组打印的 $array 的结果,$selectRa 需要每个单独写,即 $heartsN 对应 tN 和 hN

$selectRaw1 = '
    DATE_FORMAT(created_at,"%Y-%m-%d %H:%i") as time,
    ROUND(AVG(temperature*1.0),1) as t1,
    ROUND(AVG(humidity*1.0),1) as h1
';

求助,多层嵌套foreach执行时间太长了,如何使用sql进行查询优化

经过优化处理的的时间为 1 秒多
求助,多层嵌套foreach执行时间太长了,如何使用sql进行查询优化

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

把所有的 $hearts$hearts->toArray() 再遍历,会快许多,把 $heartsN 全部 $heartsN=array_column($heartsN,null,'time'), 这样就不需要循环嵌套了,又快许多

3年前 评论
lvjie1996 (楼主) 3年前
讨论数量: 7

一般像这种分时间段,时间间隔的建议用类似于 mongoDB 做数据统计。直接查很吃力!

3年前 评论

这种统计表用后台任务提前算好存在 report 表中,直接计算计算压力太大

3年前 评论

这种数据建议用时序数据库存储,或者用 Clickhouse 存储,兼容一些 SQL 查询语句。其次就是数据表的设计。

3年前 评论

:joy: 以空间换时间,冗余字段吧,反范式设计

3年前 评论

我觉得这么复杂的查询,还是用原生 SQL 语句的好。

3年前 评论

把所有的 $hearts$hearts->toArray() 再遍历,会快许多,把 $heartsN 全部 $heartsN=array_column($heartsN,null,'time'), 这样就不需要循环嵌套了,又快许多

3年前 评论
lvjie1996 (楼主) 3年前