我正在尝试优化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
除此之外,它还将显示俄罗斯以外几英里之外的位置(我知道我们可以增加距离限制,但必须有比这更好的方法)
还有其他有效的方法可以进行这样的查询吗?