我是mysql新手,但我构建了以下查询
例如,为id =1的用户查找靠近点(95,95)的人(latlong值简化)
SELECT users.id, name, email, gender, birthyear, latlong FROM (
SELECT * FROM (
# Find nearby users.
SELECT * FROM pos
WHERE X(latlong) BETWEEN 90.0 AND 100.0
AND Y(latlong) BETWEEN 90.0 AND 100.0
) AS nearby WHERE owner NOT IN (
# Find users already rated.
SELECT target FROM swipes WHERE owner = 1
) AND id != 1
) AS unratedNearby JOIN users ON unratedNearby.owner = users.id;这一切都很完美,但我担心这个查询的复杂性,以及它将如何扩展。我在桌面上有一个SPATIAL KEY 'latlong' ('latlong') (我意识到这是查找附近用户的次优方法,但准确性在这里并不重要)。任何一个用户都可以拥有无限数量的刷卡。
一旦用户和滑动表开始变得非常大,这个查询会开始崩溃吗?除了空间键之外,我还应该使用其他索引吗?
发布于 2015-04-20 10:09:23
对于这个简单的任务,您的查询似乎太复杂了。另外,您查找附近用户的方法对于查找人员( task.Consider )是非常不准确的,这个查询以哈弗森公式作为距离函数(这个函数的示例可以很容易地在网上找到)
SELECT user_id,name,email,gender,birthyear,latlong,distance(latlong) as
distance
FROM pos p left join swipes s on p.user_id = s.owner
WHERE target_id is NULL
ORDER by distance asc由于未提供create语句,此查询可能出错。但逻辑是对的。您可以加入用户在滑动表上的位置表,并使用没有记录的行,而不是按距离命令您的结果以获取附近的人。
发布于 2015-04-20 23:34:19
缩放是一个“查找最近”的问题。朴素解是O(N*N),大多数解是O(N)。
这里有一个解决方案,但它涉及数据的重组。是O(1)。示例代码在博客中。
发布于 2015-04-25 19:57:17
您是否考虑过使用GAE搜索API检索“最近的”用户,然后在该列表中查询用户的滑动用户?
https://stackoverflow.com/questions/29744464
复制相似问题