2012-10-01 93 views
1

我有一堆目录中的业务位置的记录。其实大约有4,500个。地理位置 - PHP阵列排序

我现在有一点速度问题,原因有两个。当用户加载页面时,他们被要求输入他们的邮政编码。

当他们这样做的页面将重新加载,并获取他们周围所有的企业,foreach循环和计算进入了邮政编码和存储业务的邮政编码之间的距离。初始循环完成后(包括一个SQL查询)。记录按距离用户的距离排序。

它导致页面加载速度非常缓慢,目前非常不可用。

你的建议会加快速度吗?考虑到您无法轻松缓存结果,因为每个用户的邮政编码都会有所不同。

活源 - http://discoversolar.co.uk/directory/type/mcs-installer/

+2

为了加速您的计算,我们必须看到一些代码。 –

+0

哪个部分需要很长时间? SQL查询(或者甚至是查询?)还是PHP部分? – hakre

+0

为什么不简单地返回约50个结果并对它们进行排序,只有在用户请求它们时才查询下一个50个结果? –

回答

0
+0

我不认为这是查询本身减慢了页面加载速度,它是foreach循环和距离计算。 – David

+0

某时,如果您的数据库表中没有索引,则执行查询所花的时间太长。 –

+0

我不觉得?你测量了查询吗?或者这只是一个建议,这不是循环? –

0

一种方式是过度最小化数据集过于循环。在瑞典,我们的邮政编码的组织方式是,如果代码接近另一个代码,则它们在地理上也彼此接近。

你也许可以选择100个最接近的数据点,并在那做你的事情。

即使你的算法中是O(N²),然后最小化与4 500的组会发出很大的“表现”命中(不是技术上的,而是最终用户将更快得到页)。

+0

如果你喜欢,你实际上可以在这里看到这个页面... http://discoversolar.co.uk/directory/type/mcs-installer/ – David

0

我有一个映射demo它,它使用的地理编码的位置和英国staions的数据库(2757个记录)。它速度很快,可以用于邮政编码。

+0

听起来不错,你可以邮寄给我吗? – David

+0

我花了一点时间优化查询和循环,并设法加快页面加载公平位。现在,这使我的网页可用。 – David

+0

没有得到您的电子邮件地址,请参阅我的个人资料 –

2

您需要通过移动距离计算到数据库查询,以避免PHP for循环: 1.确保你在数据库中的业务位置的坐标。 2.获取用户邮政编码的坐标。 3.使用地球公式的曲率如下。

<?php 
$postcode_latitude = x; 
$postcode_longitude = y; 

$sql = " 
    select 
     *, 
     6371.04 * acos(cos(pi()/2-radians(90-latitude)) * cos(pi()/2-radians(90-".$postcode_latitude.")) * cos(radians(longitude)-radians(".$postcode_longitude.")) + sin(pi()/2-radians(90-latitude)) * sin(pi()/2-radians(90-".$postcode_latitude."))) as distance 
    from 
     my_table 
    having 
     distance < 50 
    order by 
     distance 
    limit 0,10"; 
?> 

这会对您的业务4500个位置很好。根据sletoH.com的经验,处理100,000个数据库记录和SQL会减慢速度。在这个阶段,您需要避免通过添加SQL where子句来计算所有数据库记录的距离。