1

我在一个目录中有一堆关于营业地点的记录。实际上大约有 4,500 个。

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

当他们这样做时,页面将重新加载并获取所有企业,foreach 围绕它们循环并计算输入的邮政编码与为企业存储的邮政编码之间的距离。初始循环完成后(包括 SQL 查询)。然后根据与用户的距离对记录进行排序。

它会导致页面加载速度非常慢,并且目前非常无法使用。

您对加快这一进程有何建议?考虑到您无法轻松缓存结果,因为每个用户的邮政编码都会不同。

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

4

4 回答 4

2

您需要通过将距离计算移动到数据库查询中来避免 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 条 DB 记录,SQL 会变慢。在这个阶段,您需要通过添加 SQL where 子句来避免计算所有 DB 记录的距离。

于 2012-12-05T09:37:10.927 回答
0

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

您也许可以选择 100 个最近的数据点并在上面做您的事情。

即使您的算法是 O(n²),那么使用 4 500 最小化您的集合也会产生很大的“性能”影响(技术上不是,但最终用户会更快地获得页面)。

于 2012-10-01T09:43:12.777 回答
0

我有一个地图演示它使用地理编码作为位置和英国车站的数据库(2,757 条记录)。它非常快,可以适应邮政编码。

于 2012-10-01T10:34:44.943 回答