我在目录中有一堆营业地点的记录。实际上大约有4,500。
我目前在速度方面有点问题,原因有两个。当用户加载页面时,系统会要求他们输入邮政编码。
当他们这样做时,页面将重新加载并获取所有企业,围绕它们循环并计算输入的邮政编码与为企业存储的邮政编码之间的距离。初始循环完成后(包括 SQL 查询)。然后按与用户的距离对记录进行排序。
它导致页面加载速度非常慢,目前无法使用。
您对加快速度有什么建议?考虑到您无法轻松缓存结果,因为每个用户的邮政编码会有所不同。
实时源 - http://discoversolar.co.uk/directory/type/mcs-installer/
您需要通过将距离计算移动到数据库查询中来避免 PHP forloop :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";
?>
这将适用于您的 4,500 个营业地点。根据 sletoH.com 的经验,接近 100,000 条数据库记录,SQL 将变慢。在此阶段,您需要通过添加 SQL where 子句来避免计算所有数据库记录的距离。
你应该寻找query optimization
http://dev.mysql.com/doc/refman/5.0/en/optimization.html
http://www.techrepublic.com/article/three-easy-ways-to-optimize-your-mysql-queries/6137168
一种方法是最小化数据集的循环。在瑞典,我们的邮政编码的组织方式是,如果代码接近另一个代码,那么它们在地理上也彼此接近。
您可以选择 100 个最接近的数据点并在此基础上做您的事情。
即使你的算法是O(n²),那么用4 500最小化你的集合也会发出很大的"性能"影响(不是技术上的,但最终用户会更快地获得页面)。
我有一个地图演示 它使用地理编码来表示位置和英国站数据库(2,757 条记录)。它非常快,可以适应邮政编码。