SELECT *, ST_DISTANCE(geo_location, POINT(lon, lat)) AS distance
FROM geotable
ORDER by distance DESC
LIMIT 200;
坏消息是它会很慢,因为st_distance()没有使用空间索引。你应该尝试用最大半径来选择较少的记录来限制查询:
set @dist = 100;
set @rlon1 = [email protected]/abs(cos(radians(lat))*69);
set @rlon2 = [email protected]/abs(cos(radians(lat))*69);
set @rlat1 = lat-(@dist/69);
set @rlat2 = lat+(@dist/69);
SELECT *, ST_DISTANCE(geo_location, POINT(lon, lat)) AS distance
FROM geotable
WHERE ST_WITHIN(geo_location,ENVELOPE(LINESTRING(point(@rlon1, @rlat1), point(@rlon2, @rlat2))))
ORDER by distance DESC
LIMIT 200;
或者,如果你有每个国家的多边形坐标,你可以用这个来代替最大半径。
对不起,地理位置列上有一个空间索引。也试图避免haversine。它似乎超级慢。 – stormchaser
我的意思是:即使它在InnodB中定义,ST_DISTANCE()也不使用空间索引。你必须在MYISAM中使用空间索引。 – Nikos