0

必须有更快的方法来获得结果。这在我的小型数据库中效果很好,但在我的大型数据库(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....

}

谢谢,布赖恩

4

2 回答 2

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
于 2013-05-25T16:38:06.257 回答
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)

然后在查询中加入这些表,而不是对从数据库检索的每一行执行实际的数学三角函数。

于 2013-05-25T16:30:32.373 回答