获得以下结果的优化查询可以是啥[关闭]
Posted
技术标签:
【中文标题】获得以下结果的优化查询可以是啥[关闭]【英文标题】:what can be the optimized query for getting below result [closed]获得以下结果的优化查询可以是什么[关闭] 【发布时间】:2019-09-07 01:31:09 【问题描述】:我有两张桌子:
-
职位
设备
i 位置表中的数百万条数据。我与设备和位置有一对多的关系。任何设备都有很多位置。
位置表的属性是
id
、deviceid
、servertime
、latitude
、longitude
、attributes
位置表的数据样本是
`3127557`, `2`, `'2019-08-08 09:00:16'`, `27.72634`, `85.303055`, `'\"ignition\":false,\"status\":4294949887,\"io1\":\"429\",\"io2\":\"02\",\"io3\":\"00104\",\"io4\":\"33312\",\"distance\":1.98,\"totalDistance\":1215137.92,\"motion\":true'`;
┌─────────┬──────────┬─────────────────────┬──────────┬───────────┬─────────────────────────────────────────────┐
│ id │ deviceid │ servertime │ latitude │ longitude │ attributes │
├─────────┼──────────┼─────────────────────┼──────────┼───────────┼─────────────────────────────────────────────┤
│ 3127557 │ 2 │ 2019-08-08 09:00:16 │ 27.72634 │ 85.303055 │ "ignition":FALSE, "status":4294949887, │
│ │ │ │ │ │ "io1": "429", "io2": "02", "io3": "00104", │
│ │ │ │ │ │ "io4": "33312", "distance":1.98, │
│ │ │ │ │ │ "totalDistance":1215137.92, "motion":TRUE │
└─────────┴──────────┴─────────────────────┴──────────┴───────────┴─────────────────────────────────────────────┘
附加信息:我在 json 格式的属性列中有 totalDistance 索引,每次添加新位置时都会增加。
现在我需要检索在特定日期间隔(例如 2018-08-23 到 2018-08-30 之间)之间的巴士行驶距离的每日报告。
select deviceid, min(id), max(date(id) from posiotins
where deviceid in [2,3,6]
group by date(servetime)
将这些 id 保存在数组 ids[] 和
再次Select * from postions where ids in [ids] order by deviceid, id
然后我从连续的第 2 个值减去第一个值的总距离,以获得每日行驶距离报告
【问题讨论】:
不使用max(date(id)
,为什么还要计算它?
他们为我提供了每个设备每天的位置的第一个和最后一个实例。我已将它们保存在数组中,并将其作为数组传递给另一个查询。
你正在失去从午夜之前到午夜之后的距离。
你说“一定的时间间隔”——你的意思是日期还是秒?
我的意思是说日期,我已经编辑了问题。
【参考方案1】:
您遇到了缩放问题。你越早解决它越好。 现在有数百万行,但它正朝着十亿行进,对吗?
一个简单但部分的解决方法是添加第三个表,该表是每晚大约午夜时分的每辆车的数据。一种简单的方法是在摄取期间记录每辆车午夜后的第一个数据点。
什么计算“总距离”?它闻起来像里程表。如果是这样,它非常简单地由车辆提供。相反,如果您要为每条传入的记录添加它,那么...
您需要多久更新一次?每天会更有效率。实时更新变得更加复杂和昂贵。 你是根据什么计算它的?车辆是否提供增量距离?还是您使用 lat/lng 进行计算?我提到的第三个表可能应该将total_distance
作为一列,而不是隐藏在 JSON 中。和/或它应该有distance_for_the_day
。
想想最终的查询——“这辆车在过去一周里跑了多远”。看看新表会变得多么简单和快捷。
【讨论】:
这是个好主意,但我可以编辑数据库表。并且数据库将被归档并重置为每个实例它有 1 亿个数据。所以我需要优化查询。我在另一个也有同样类型的问题。所以,如果有任何优化解决方案,我也可以在另一个问题中使用它。 @CHARITRASHRESTHA - 是的,有一些权衡。 “编辑”呢?您会更改已折叠到total_distance
中的值吗?一种方法是重新计算编辑当天的行。 (希望这种情况很少见。)另请阅读汇总表:mysql.rjweb.org/doc.php/summarytables
@CHARITRASHRESTHA - “存档并重置” - 这可能会很昂贵。请参阅this,了解如何通过分区有效地做到这一点。
是的,但我无法访问地理设备和数据库的连接。剩下的唯一解决方案就是优化。并感谢您的宝贵意见。以上是关于获得以下结果的优化查询可以是啥[关闭]的主要内容,如果未能解决你的问题,请参考以下文章