首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化Tinder类型mysql查询

优化Tinder类型mysql查询
EN

Stack Overflow用户
提问于 2015-04-20 09:48:46
回答 3查看 469关注 0票数 13

我是mysql新手,但我构建了以下查询

  1. 使用latlong点数表(表pos)查找附近的用户。
  2. 移除已被分级的用户(表刷)。
  3. 将结果连接到users表。

例如,为id =1的用户查找靠近点(95,95)的人(latlong值简化)

代码语言:javascript
复制
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') (我意识到这是查找附近用户的次优方法,但准确性在这里并不重要)。任何一个用户都可以拥有无限数量的刷卡。

一旦用户和滑动表开始变得非常大,这个查询会开始崩溃吗?除了空间键之外,我还应该使用其他索引吗?

EN

回答 3

Stack Overflow用户

发布于 2015-04-20 10:09:23

对于这个简单的任务,您的查询似乎太复杂了。另外,您查找附近用户的方法对于查找人员( task.Consider )是非常不准确的,这个查询以哈弗森公式作为距离函数(这个函数的示例可以很容易地在网上找到)

代码语言:javascript
复制
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语句,此查询可能出错。但逻辑是对的。您可以加入用户在滑动表上的位置表,并使用没有记录的行,而不是按距离命令您的结果以获取附近的人。

票数 3
EN

Stack Overflow用户

发布于 2015-04-20 23:34:19

缩放是一个“查找最近”的问题。朴素解是O(N*N),大多数解是O(N)。

这里有一个解决方案,但它涉及数据的重组。是O(1)。示例代码在博客中。

票数 0
EN

Stack Overflow用户

发布于 2015-04-25 19:57:17

您是否考虑过使用GAE搜索API检索“最近的”用户,然后在该列表中查询用户的滑动用户?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29744464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档