在SQL中按距离搜索

时间:2011-08-29 02:15:22

标签: mysql user-defined-functions

我正在计划一个网站(Drupal / MySQL),它必须根据距离某个位置的距离搜索一个相当大的数据库(我们从约20,000个位置开始)。到目前为止,我发现以合理的方式搜索的最佳解决方案是在SQL中使用用户定义的函数来计算坐标之间的距离,例如:

SELECT *, CoordinateDistanceMiles(lat, lon, ${inputLat}, ${inputLon}) as distance
FROM items WHERE distance < {$radius}

(使用John Dyer的distance function或类似的)

但是,我还读到UDF非常低效。我的第二个想法(和暂定计划)是在另一个查询中嵌套另一个查询来缩小其范围,因此在更小的项目子集上运行UDF,例如:

SELECT *, CoordinateDistanceMiles(lat, lon, ${inputLat}, ${inputLon}) as distance
FROM (
    SELECT * FROM items WHERE
        lat BETWEEN ${inputLat - const} AND ${inputLat + const} AND
        lon BETWEEN ${inputLon - const} AND ${inputLon + const}
) WHERE distance < ${radius}

此模型会使搜索更快,还是更复杂?有没有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

这里使用UDF的开销可以忽略不计,只要你执行扫描distance < ${radius}并进行2次基于范围的比较(它们不能用索引进行优化)。

所以不要担心UDF“效率低下”并使用它,因为它更具可读性。