获得以下结果的优化查询可以是啥[关闭]

Posted

技术标签:

【中文标题】获得以下结果的优化查询可以是啥[关闭]【英文标题】:what can be the optimized query for getting below result [closed]获得以下结果的优化查询可以是什么[关闭] 【发布时间】:2019-09-07 01:31:09 【问题描述】:

我有两张桌子:

    职位 设备

i 位置表中的数百万条数据。我与设备和位置有一对多的关系。任何设备都有很多位置。

位置表的属性是 iddeviceidservertimelatitudelongitudeattributes

位置表的数据样本是

`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,了解如何通过分区有效地做到这一点。 是的,但我无法访问地理设备和数据库的连接。剩下的唯一解决方案就是优化。并感谢您的宝贵意见。

以上是关于获得以下结果的优化查询可以是啥[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何优化我的查询以更快地获得结果?

MySQL 查询优化以获得月度报告

如何优化此查询并使其执行得更快? [关闭]

如何从charindex获得准确的结果? [关闭]

需要优化 mssql 查询以获得最快的速度

SQL Server 外部应用查询优化