【发布时间】:2020-04-04 20:15:13
【问题描述】:
我在服务器的MySQL 数据库中存储了 4 维数据点。具有三个空间 GPS 数据(lat、lon、alt)的一维数据。 GPS 数据按 1 分钟的时间范围对数千名用户进行采样,并将 24x7 全天候添加到我的服务器中。
示例 REST/post json 看起来像,
{
"id": "1005",
"location": {
"lat":-87.8788,
"lon":37.909090,
"alt":0.0,
},
"datetime": 11882784
}
现在,我需要过滤掉在给定时间段内位置与给定userID 距离在公里范围内的所有候选人 (userID)。
用于过滤的示例 REST/get 查询参数看起来像,
{
"id": "1001", // user for whose we need to filter out candidates IDs
"maxDistance":3, // max distance in meter to consider (euclidian distance from users location to candidates location)
"maxDuration":14 // duration offset (in days) from current datetime to consider
}
正如我们所见,每分钟在我的数据库中插入数以千计的条目,从而导致总条目数巨大。因此,要对所有过滤条目进行迭代,恐怕对于我目前的要求来说,简单的幼稚方法是不可行的。那么,我应该在服务器中实现什么算法呢?我试图实现简单的算法,例如,
params ($uid, $mDis, $mDay)
1. Init $candidates = []
2. For all the locations $Li of user with $uid
3. For all locations $Di in database within $mDay
4. $dif = EuclidianDis($Li, $Di)
5. If $dif < $mDis
6. $candidates += userId for $Di
7. Return $candidates
但是,这种方法在实践中非常缓慢。并且预先计算可能不可行,因为它为所有userIDs 花费了巨大的空间。 还有什么算法可以提高效率?
【问题讨论】:
-
k 是固定的还是每个查询都不同?
-
距离可以在(2~5)米范围内,持续时间可以在(1~14)天范围内。
标签: mysql algorithm multidimensional-array data-structures filter