目前我有一些100k +行的表。我正在尝试查找以下数据。
SELECT
*, SQRT(POW(69.1 * (latitude - '49.1044302'), 2) + POW(69.1 * ('-122.801094' - longitude) * COS(latitude / 57.3), 2)) AS distance
FROM stops
HAVING distance < 5
ORDER BY distance limit 100
但是目前这种方法在高负荷下会变慢。有些查询需要20多秒才能完成。
如果有人知道任何更好的优化方法,那就太棒了。
答案 0 :(得分:2)
首先,如果你有很多地理空间数据,你应该使用mysql的地理空间扩展而不是像这样的计算。然后,您可以create spatial indexes加快许多查询,而且您不必像上面那样编写冗长的查询。
使用与ST_Distance的比较或创建具有感兴趣半径的几何以及ST_within可能会给您带来良好的效果,并且可能比当前快得多。然而,实现这一目标的最好和最快的方法是ST_Dwithin尚未在mysql中实现。
答案 1 :(得分:1)
空间索引肯定取决于MySQL版本。我们的网站也搜索纬度/经度,但我们使用的是旧版本的MySQL(5.1-something)(没有空间索引)。您的查询与我们的查询类似,但我们的查询基于弧度。根据您的确切需求,您可以优化(从您拥有的)优化它。
至少我们是这样做的。