很抱歉,如果已经回答了这个问题(我确定有人会向我发送链接,如果有的话)。我曾经想过一个类似的问题,但我现在找不到它。
因此,对于这个问题:我正在构建用户搜索我正在开发的网站,其中一个搜索条件将基于与搜索用户的距离。我已经有一张美国邮政编码及其相应的Lat / Long表格。我还想出了如何确定边界框(最大纬度/最小拉特 - 最大长/分长)以确定哪个拉链符合标准(我们不会担心精确的半径。地理广场暂时就足够了)。我的问题 - 如何构建查询以优化速度?我应该:
OR
我想第二种方法会更快,但我没有支持证据/具体经验表明它会。我知道足够多的SQL可以解决这个问题,但是我仍然不熟悉它,并且在涉及不同类型操作的相对性能时也没有任何线索。
谢谢你的时间!
答案 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和优化它。