1

ディレクトリに事業所のレコードがたくさんあります。実際には約4,500です。

2 つの理由から、現時点では速度に少し問題があります。ユーザーがページをロードすると、郵便番号を入力するよう求められます。

そうすると、ページがリロードされてすべてのビジネスが取得され、foreach ループでそれらがループされ、入力された郵便番号とそのビジネス用に保存された郵便番号の間の距離が計算されます。最初のループが完了した後 (SQL クエリを含む)。次に、レコードはユーザーからの距離によってソートされます。

ページの読み込みが非常に遅くなり、現時点ではほとんど使用できません。

これをスピードアップするための提案は何ですか? 各ユーザーの郵便番号が異なるため、結果を簡単にキャッシュできないことを考慮してください。

ライブ ソース - http://discoversolar.co.uk/directory/type/mcs-installer/

4

4 に答える 4

2

距離の計算をデータベース クエリに移動して、PHP の forloop を回避する必要があります。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での経験から、DB レコードが 100,000 に近づくと、SQL の速度が低下します。この段階では、SQL where 句を追加して、すべての DB レコードの距離を計算しないようにする必要があります。

于 2012-12-05T09:37:10.927 に答える
0

場所のジオコーディングと英国の駅のデータベース (2,757 レコード) を使用するマッピングデモIt があります。これは非常に高速で、郵便番号に適応できます。

于 2012-10-01T10:34:44.943 に答える
0

1 つの方法は、ループ オーバーしすぎるデータセットを最小限に抑えることです。ここスウェーデンでは、郵便番号が別のコードに近い場合、地理的にも互いに近いように郵便番号が編成されています。

おそらく、最も近い 100 個のデータポイントを選択して、それに基づいて処理を行うことができます。

アルゴが O(n²) であっても、セットを 4 500 で最小化すると、大きな「パフォーマンス」ヒットが発生します (技術的にではありませんが、エンド ユーザーはページをはるかに高速に取得します)。

于 2012-10-01T09:43:12.777 に答える
0

あなたは探す必要があります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

于 2012-10-01T09:30:59.857 に答える