我正在尝试按站点访问者与数据库行中列出的位置的距离对mySQL结果进行排序。我应该在mySQL中进行排序并获取排序结果,还是从mySQL数据库中检索未排序的结果然后使用PHP排序?我的表现有区别吗?
如果我使用mySQL排序,这是我将使用的SQL代码。
SELECT ((ACOS(SIN($lat * PI() / 180) * SIN(lat * PI() / 180)
+ COS($lat * PI() / 180) * COS(lat * PI() / 180) * COS(($lon – lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515)
AS `distance` FROM `members` HAVING `distance`<=’10′ ORDER BY `distance` ASC
答案 0 :(得分:2)
两种方式并比较结果。这在很大程度上取决于您的实际设置。如果你有一个低于标准的数据库服务器和一个kick-ass网络服务器,那么PHP可能会更快。如果您有一个超级数据库服务器和一个486用于Web服务器,那么数据库排序可能会更快。这一切都取决于你的设置。
编辑另外,我建议您将经度和纬度存储在弧度中,这样您就不必在每次进行查询时都进行所有这些转换。
答案 1 :(得分:2)
当你必须处理地理数据时,我可以用PostGIS扩展来推荐PostgreSQL。它在计算lat和lng之间的距离方面更快。在PostgreSQL with PostGIS中,您的查询看起来像那样(未经测试):
SELECT *
FROM members
WHERE ST_Distance_Sphere(members.position, ST_GeomFromText("POINT
(47.8012079 13.0395594)", 4326) <= 10000
ORDER BY ST_Distance_Sphere(members.position, ST_GeomFromText("POINT
(47.8012079 13.0395594)", 4326)
ST_Distance_Sphere(members.position, ST_GeomFromText("POINT
(47.8012079 13.0395594)", 4326)
函数可以为您提供成员的给定点(POINT
(47.8012079 13.0395594)
)和位置members.position
之间的距离。你可以在一个语句中多次使用这个函数,PostgreSQL会为你缓存它(并且不计算两次距离)。
不要忘记在members.position
列添加所谓的“空间索引”。请查看http://postgis.refractions.net/和http://www.postgresql.org/
如果你无法从postgresql开始,网上有很多教程。或者,请问这里;)
的问候, TUX
答案 2 :(得分:1)
在评论中回答Nyxynyx问题“顺便说一下,如果你查看我公布的找到距离的公式,答案的单位是多少?米?我的输入在(x.xxxxxx,x.xxxxxx)之类的google maps v3 api中使用的那个。我不确定它叫什么?“
您的计算输入是纬度(纬度)和经度(lng)
http://en.wikipedia.org/wiki/Geographic_coordinate_system
在
找到有关计算的说明答案 3 :(得分:1)
我使用一行代码来确定潜在结果周围的边界框,然后您只对数据子集运行查询。
例如最大LNG,最大LAT,最小LNG,最小LAT。
否则,您的SQL语句将针对表中的每条记录运行。
我们的应用程序目前有28000个位置,所以边界框非常必要!
class Geo{
function RadiusCheck($lat, $lng, $miles) {
$EQUATOR_LAT_MILE = 69.172;
$maxLat = $lat + $miles / $EQUATOR_LAT_MILE;
$minLat = $lat - ($maxLat - $lat);
$maxLng = $lng + $miles / (cos($minLat * M_PI / 180) * $EQUATOR_LAT_MILE);
$minLng = $lng - ($maxLng - $lng);
$result['minLat'] = $minLat;
$result['maxLat'] = $maxLat;
$result['minLng'] = $minLng;
$result['maxLng'] = $maxLng;
return $result;
}
}
答案 4 :(得分:0)
等什么?没有!如果你要返回数以千计的结果,你可以打赌它在适当配置的mysql服务器上会更快。设置适当的索引,存储您的lat&amp;像CanSpice建议的那样长度为弧度,只返回你需要的结果......在mysql服务器上排序。 @CanSpice关于检查哪个更快是正确的,但在我看来,如果您的数据库服务器速度较慢,那么您的配置错误。修复它!