根据到坐标的距离加速 mySQL SPATIAL select
Speeding up mySQL SPATIAL select based on distance to coordinates
我正在尝试将我们的网站从使用 Lat/Lng 字段 (CHAR) 转移到距离上。这就是我们目前的做法:
SELECT ID,( 6371 * acos( cos( radians(52.35462) ) * cos( radians( glinks_Links.Latitude ) ) * cos( radians( glinks_Links.Longitude ) - radians(4.88227) ) + sin( radians(52.35462) ) * sin( radians( glinks_Links.Latitude ) ) ) ) AS distance FROM glinks_Links
WHERE
(
((Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)) )
AND
(Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5))
)
HAVING distance < 40 ORDER BY distance
...这会返回
Showing rows 0 - 24 (1855 total, Query took 0.0288 seconds.)
然后是另一个实际返回 "distance" 的版本(因为我们想按它排序,并且只包括最接近的);
SELECT ID,st_distance_sphere(POINT(4.88227,52.35462), point_test) / 1000 AS distance FROM glinks_Links WHERE ( ((Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)) ) AND (Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5)) ) HAVING DISTANCE < 100 ORDER BY distance LIMIT 100
给出:
Showing rows 0 - 99 (100 total, Query took 0.0237 seconds.)
那么最好的是:
SELECT *
FROM glinks_Links
where st_distance_sphere(POINT(4.88227,52.35462), point_test)/1000 <= 100
Showing rows 0 - 24 (3439 total, Query took 0.0015 seconds.)
不过,问题在于它无法为我提供距离!我想做的是查询并获取最接近的 100 个。有没有一种方法可以在不影响速度的情况下做到这一点?
确保你在
上有合适的复合索引
create index my_idx ON glinks_Links (Latitude, Longitude, ID)
而且你不需要无用的 () 作为 where 条件(使用 AND)
SELECT ID,( 6371 * acos( cos( radians(52.35462) ) * cos( radians( glinks_Links.Latitude ) )
* cos( radians( glinks_Links.Longitude ) - radians(4.88227) ) + sin( radians(52.35462) )
* sin( radians( glinks_Links.Latitude ) ) ) ) AS distance
FROM glinks_Links
WHERE Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)
AND Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5)
HAVING distance < 40
ORDER BY distance
第二个版本
SELECT ID, st_distance_sphere(POINT(4.88227,52.35462), point_test) / 1000 AS distance
FROM glinks_Links
WHERE Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)
AND Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5)
HAVING DISTANCE < 100
ORDER BY distance
LIMIT 100
你应该在
上使用复合索引
create index myidx ON glinks_Links (Latitude, Longitude, point_test, ID )
我正在尝试将我们的网站从使用 Lat/Lng 字段 (CHAR) 转移到距离上。这就是我们目前的做法:
SELECT ID,( 6371 * acos( cos( radians(52.35462) ) * cos( radians( glinks_Links.Latitude ) ) * cos( radians( glinks_Links.Longitude ) - radians(4.88227) ) + sin( radians(52.35462) ) * sin( radians( glinks_Links.Latitude ) ) ) ) AS distance FROM glinks_Links
WHERE
(
((Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)) )
AND
(Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5))
)
HAVING distance < 40 ORDER BY distance
...这会返回
Showing rows 0 - 24 (1855 total, Query took 0.0288 seconds.)
然后是另一个实际返回 "distance" 的版本(因为我们想按它排序,并且只包括最接近的);
SELECT ID,st_distance_sphere(POINT(4.88227,52.35462), point_test) / 1000 AS distance FROM glinks_Links WHERE ( ((Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)) ) AND (Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5)) ) HAVING DISTANCE < 100 ORDER BY distance LIMIT 100
给出:
Showing rows 0 - 99 (100 total, Query took 0.0237 seconds.)
那么最好的是:
SELECT *
FROM glinks_Links
where st_distance_sphere(POINT(4.88227,52.35462), point_test)/1000 <= 100
Showing rows 0 - 24 (3439 total, Query took 0.0015 seconds.)
不过,问题在于它无法为我提供距离!我想做的是查询并获取最接近的 100 个。有没有一种方法可以在不影响速度的情况下做到这一点?
确保你在
上有合适的复合索引 create index my_idx ON glinks_Links (Latitude, Longitude, ID)
而且你不需要无用的 () 作为 where 条件(使用 AND)
SELECT ID,( 6371 * acos( cos( radians(52.35462) ) * cos( radians( glinks_Links.Latitude ) )
* cos( radians( glinks_Links.Longitude ) - radians(4.88227) ) + sin( radians(52.35462) )
* sin( radians( glinks_Links.Latitude ) ) ) ) AS distance
FROM glinks_Links
WHERE Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)
AND Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5)
HAVING distance < 40
ORDER BY distance
第二个版本
SELECT ID, st_distance_sphere(POINT(4.88227,52.35462), point_test) / 1000 AS distance
FROM glinks_Links
WHERE Latitude BETWEEN (52.35462 - 40/69.0) AND (52.35462 + 40/69.0)
AND Longitude BETWEEN (4.88227 - 40/42.5) AND (4.88227 + 40/42.5)
HAVING DISTANCE < 100
ORDER BY distance
LIMIT 100
你应该在
上使用复合索引 create index myidx ON glinks_Links (Latitude, Longitude, point_test, ID )