Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过空间索引优化邻近位置MYSQL查询_Mysql - Fatal编程技术网

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

通过空间索引优化邻近位置MYSQL查询,mysql,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 FR

我正在尝试优化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
然而,这比第一个查询平均长23秒,这让我非常惊讶

我是否应该对我的查询做些其他事情来加速它

我得到的唯一一件事是在1秒之内把它添加到这篇文章中

然而,代码中有几个bug。如果我选择斐济,它将只显示<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
除此之外,它还将显示俄罗斯境内几英里以外的位置。我知道我们可以增加距离限制,但肯定有比这更好的方法

还有其他有效的方法来进行这样的查询吗


共享表结构就像您链接到的问题中一样,使用ST_distance或ST_distance_sphere而不是ST_Length。您好,在那里,尝试使用ST_distance仍然18秒来运行查询选择名称ST_distancept,POINT174.763336,-36.848461作为与城市的距离Db ORDER BY distanceRaw LIMIT 50
    longitude BETWEEN longpoint - (50.0 / (111.045 * COS(RADIANS(latpoint)))) 
AND longpoint + (50.0 / (111.045 * COS(RADIANS(latpoint))))
    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