必须有更快的方法来获得结果。这在我的小型数据库中运行良好,但在我的大型恐慌(2000万行)中,这个过程需要永远。我已经尝试为lat和lon列创建索引,但这确实有帮助。除了硬件升级,有没有办法可以加快速度?目前它正在采用一组线索并将它们与数据库中的每一行进行比较。我将结果限制为10。
$sql = sprintf("SELECT lat, lon, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lon ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM $tbl_name HAVING distance < '%s' ORDER BY distance LIMIT $start, $limit",
mysql_real_escape_string($lat),
mysql_real_escape_string($lon),
mysql_real_escape_string($lat),
mysql_real_escape_string($radius));
$result = mysql_query($sql);
while($row = @mysql_fetch_assoc($result)) {
echo oresults....
}
感谢, 布赖恩
答案 0 :(得分:1)
这只是在黑暗中拍摄的,但也许你通过将数据范围限制为可能在距离圆中的纬度和经度来减少计算次数。
类似的东西:
$MinLatitude = $User_Latitude - $Distance
$MaxLatitude = $User_Latitude + $Distance
$MinLongitude = $User_Longitude - $Distance
$MaxLongitude = $User_Longitude + $Distance
然后,您可以在SQL语句中添加WHERE子句以减少计算次数:
WHERE $MinLatitude <= lat AND lat <= $MaxLatitude
AND $MinLongitude <= lon AND lon <= $MaxLongitude
答案 1 :(得分:0)
我要做的第一件事就是调整一个触发表
Create table TrigVals (
Radians decimal(18,15) primary Key Not null,
Sin decimal(18,17) not null,
Cos decimal(18,17) not null)
然后在sin和cos列上创建两个额外的唯一索引用于反向查找(arcSin和arcos函数),
将此表格填入您需要的值范围(纬度,0到pi / 2;经度,0到pi)
然后在查询中加入这些表,而不是在从数据库中检索的每一行上执行实际的数学触发函数。