Laravel下每日仅一行传感器数据最大最小值快速查询方法咨询
方案合理性判断
单独创建每日最大最小值汇总表是非常合理的方案,也是物联网时序类数据存储的常规优化手段,查询效率相比直接从30分钟粒度表聚合要高几十倍以上,尤其适合查询频率高、时间跨度大的场景。
具体实现方案
方案1:推荐方案-新增每日汇总表
- 表结构设计(仅参考,可根据需求扩展):
| 字段名 | 类型 | 说明 |
|---|---|---|
| date | date | 日期,设为主键/唯一索引 |
| day_max | float | 当日传感器最大值 |
| day_min | float | 当日传感器最小值 |
| 可选扩展字段 | / | 当日平均、统计时间等 |
数据同步逻辑:
可以和你现有的30分钟粒度聚合任务联动,每天凌晨跑定时任务计算前一天的最大最小值写入即可;如果需要实时性,也可以在每次更新30分钟粒度表时,判断当前值是否超过每日表已存的最大/最小值,同步更新即可。Laravel查询代码示例:
// 假设每日汇总表对应的模型为SensorDailyStat $startDay = '2021-01-01'; $endDay = '2021-01-31'; $dailyStats = SensorDailyStat::select('date', 'day_max', 'day_min') ->whereBetween('date', [$startDay, $endDay]) ->get();
该方案不需要做任何聚合运算,直接走日期索引查询,性能最高。
方案2:不新增表,直接从现有30分钟粒度表查询
适合查询频率低、时间跨度小的场景,需要提前给Date字段加索引:
Laravel查询代码示例:
// 假设30分钟粒度表对应的模型为SensorAggregate30Min $startDay = '2021-01-01'; $endDay = '2021-01-31'; $dailyStats = SensorAggregate30Min::selectRaw( 'DATE(`Date`) as date, MAX(`Maximum of the day`) as day_max, MIN(`Minimum`) as day_min' ) ->whereBetween('Date', [$startDay, $endDay.' 23:59:59']) ->groupByRaw('DATE(`Date`)') ->get();
注:因为你现有30分钟表中同日期的最大、最小值已经冗余为相同值,用MAX/MIN聚合和取任意一条的结果一致,不会出现逻辑错误。
内容的提问来源于stack exchange,提问作者Stefano Martini
相关产品推荐
相关产品推荐

