通过空间索引优化附近的位置MYSQL查询

时间:2018-07-19 16:06:43

标签: mysql

我正在尝试优化SQL查询以显示最近的位置。

最初我正在使用以下查询

SELECT name,path, ( 6371 * acos( cos( radians(-36.848461) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(174.763336) ) + sin( radians(-36.848461) ) * sin( radians( latitude ) ) ) ) AS distance FROM cityDB HAVING distance < 200 AND path IS NOT NULL

此查询使用经度/纬度值来计算距离,并且需要14.5秒才能完成(太慢了!)

我创建了经度/纬度值的空间索引(点),以加快查询速度。

    SELECT DISTINCT name,
  (ST_Length(ST_LineStringFromWKB(
    LineString(
      pt,
      ST_PointFromText('POINT(174.763336 -36.848461)', 4326)))))
  AS distance
FROM CityDB
ORDER BY distance ASC LIMIT 99

但是,这平均比第一个查询还要长23秒,这真让我感到惊讶!

我还需要对查询进行其他操作以加快查询速度吗?

我只有不到1秒的时间可以添加它(感谢这篇文章Improving performance of spatial MySQL query

    longitude BETWEEN longpoint - (50.0 / (111.045 * COS(RADIANS(latpoint)))) 
AND longpoint + (50.0 / (111.045 * COS(RADIANS(latpoint))))

但是,代码中有几个错误。如果我选择斐济,则只会显示<180纬度的位置,如果选择瓦努阿图,则只会显示<-180纬度的位置。

    SELECT DISTINCT name, (ST_Length
(ST_LineStringFromWKB(LineString( pt, ST_PointFromText('POINT(-179.276277 -18.378639)', 4326))))) 
AS distance FROM CityDB 
WHERE longitude BETWEEN -179.276277 - (50.0 / (111.045*COS(RADIANS(-18.378639)))) AND -179.276277 + (50.0 / (111.045 * COS(RADIANS(-18.378639)))) 
GROUP BY (name) ORDER BY distance ASC LIMIT 99

除此之外,它还将显示俄罗斯以外几英里之外的位置(我知道我们可以增加距离限制,但必须有比这更好的方法)

还有其他有效的方法可以进行这样的查询吗?

enter image description here

0 个答案:

没有答案
相关问题