Mysql 使用什么算法从高维数据点中过滤出来?

Mysql 使用什么算法从高维数据点中过滤出来?,mysql,algorithm,multidimensional-array,data-structures,filter,Mysql,Algorithm,Multidimensional Array,Data Structures,Filter,我在服务器中的MySQL数据库中存储了4维数据点。具有三个空间GPS数据(lat、lon、alt)的一维数据。GPS数据按1分钟的时间段为数千名用户采样,并全天候添加到我的服务器 示例REST/post json如下所示: { "id": "1005", "location": { "lat":-87.8788, "lon":37.909090, "alt":0.0, }, "datetime": 11882784 }

我在服务器中的
MySQL
数据库中存储了4维数据点。具有三个空间GPS数据(lat、lon、alt)的一维数据。GPS数据按1分钟的时间段为数千名用户采样,并全天候添加到我的服务器

示例REST/post json如下所示:

{
   "id": "1005",
    "location": {
        "lat":-87.8788,
        "lon":37.909090,
        "alt":0.0,
    },
    "datetime": 11882784
}
{
    "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
}
现在,我需要过滤掉所有候选人(
userID
),他们的位置在给定时间段内距离给定的
userID
k米以内

用于筛选的示例REST/get查询参数如下所示

{
   "id": "1005",
    "location": {
        "lat":-87.8788,
        "lon":37.909090,
        "alt":0.0,
    },
    "datetime": 11882784
}
{
    "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
params($uid,$mDis,$mDay)
1.Init$candidates=[]
2.对于具有$uid的用户的所有位置$Li
3.对于$mDay内数据库中的所有位置$Di
4.             $dif=欧几里得语($Li,$Di)
5.如果$dif<$mDis
6.                 $候选人+=$Di的用户ID
7.返回$候选者
然而,这种方法在实践中非常缓慢。而且预计算可能不可行,因为它为所有
userID
s花费了巨大的空间还有什么算法可以提高效率?

您可以实现一种算法,在给定的区域/时间内高效地查询数据库中的候选人

将三维空间划分为宽度为k的三维立方体网格,在将数据点插入数据库时,计算该点所在的立方体,并基于立方体坐标计算哈希值

在查询另一个数据点d的k范围内的所有数据点时,计算d所在的多维数据集,并找到8个相邻的多维数据集(+/-1)。计算9个多维数据集的散列值,并在给定时间段内查询数据库中具有这些散列值的所有条目。您将有一个小的候选集,然后可以从中迭代以查找d的k范围内的所有数据点

如果你的k值在2-5米之间,给你的立方体一个5米的宽度


时间戳可以存储为单独的字段,或者您可以将多维数据集设置为4维,并将时间戳包含在哈希中,然后搜索27个多维数据集而不是9个。

k是固定的还是每个查询可以不同?距离可以在(2~5)米范围内,持续时间可以在(1~14)天范围内。