基于距离的优化用户数据库搜索

时间:2012-06-28 20:38:55

标签: mysql database zipcode

很抱歉,如果已经回答了这个问题(我确定有人会向我发送链接,如果有的话)。我曾经想过一个类似的问题,但我现在找不到它。

因此,对于这个问题:我正在构建用户搜索我正在开发的网站,其中一个搜索条件将基于与搜索用户的距离。我已经有一张美国邮政编码及其相应的Lat / Long表格。我还想出了如何确定边界框(最大纬度/最小拉特 - 最大长/分长)以确定哪个拉链符合标准(我们不会担心精确的半径。地理广场暂时就足够了)。我的问题 - 如何构建查询以优化速度?我应该:

  • 执行所需的数学运算以确定边界框,然后查询zip表以找到所有潜在候选人的邮政编码,然后搜索具有这些邮政编码的用户?

OR

  • 确定纬度/长边界框,将zip表与用户表一起加入,并返回结果与纬度/长度介于参数之间的用户?

我想第二种方法会更快,但我没有支持证据/具体经验表明它会。我知道足够多的SQL可以解决这个问题,但是我仍然不熟悉它,并且在涉及不同类型操作的相对性能时也没有任何线索。

谢谢你的时间!

2 个答案:

答案 0 :(得分:2)

我相信您的最终查询应如下所示:

-- compute @minLat, @maxLat, @minLon, @maxLon

SELECT users.*
FROM users
JOIN locations ON locations.id = users.location
WHERE locations.latitude BETWEEN @minLat AND @maxLat
AND locations.longitude BETWEEN @minLon AND @maxLon

所以在这种情况下,我不理解你的担忧,因为一切都在一次性发生。查询优化器通常比任何JOIN首先执行的人更清楚。

如果您想要实现更复杂的计算以确定邮政编码是否在范围内,那么我更愿意首先建立邮政编码列表,然后匹配居住在这些区域的用户。

这假设计算邮政编码是否在搜索范围内是操作中最昂贵的部分。因此,我更倾向于使用尽可能小的数据集运行此计算(即仅限邮政编码,而不是ZIP +用户)。即使在这种情况下,查询优化器也许能够为您做出正确的选择。

答案 1 :(得分:1)

您描述的两种算法可以如下示意性地描述:

A INNER JOIN B WHERE A satisfies condition

(A WHERE A satisfies condition) INNER JOIN B

前者只是一个连接(条件可能是连接条件或WHERE条件,但这对INNER JOIN和MySQL来说并不重要。)

后者涉及子查询。您的描述似乎假设首先计算子查询,然后是连接,但通常是not the case。首先评估内连接,然后再计算子查询,这可能会给你与第一种情况相同的执行计划。

所以这两种方法似乎与绩效的观点没有什么不同,你应该专注于选择一个最容易阅读和维护的方法,并且当这一天到来时,profile和优化它。