0

私はすべての英国の郵便番号を保持するテーブル郵便番号を持っています(約1.8miだと思います)

CREATE TABLE `Postcode` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Postcode` varchar(8) DEFAULT NULL,
  `Postcode_Simple` varchar(8) DEFAULT NULL,
  `Positional_Quality_Indicator` int(11) DEFAULT NULL,
  `Eastings` int(11) DEFAULT NULL,
  `Northings` int(11) DEFAULT NULL,
  `Latitude` double DEFAULT NULL,
  `Longitude` double DEFAULT NULL,
  `LatLong` point DEFAULT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `Postcode` (`Postcode`),
  KEY `Postcode_Simple` (`Postcode_Simple`),
  KEY `LatLong` (`LatLong`(25))
) ENGINE=InnoDB AUTO_INCREMENT=1755933 DEFAULT CHARSET=latin1;

私が達成したいのは...座標を指定して、座標に最も近い郵便番号を見つけます。問題は、これを行うために作成したクエリ(実際にはストアドプロシージャ内)に少し問題があることです。クエリは次のとおりです。

SELECT
    Postcode
FROM
    (SELECT
        Postcode,
        GLENGTH(
            LINESTRINGFROMWKB(
                LINESTRING(
                    LatLong, 
                    GEOMFROMTEXT(CONCAT('POINT(', varLatitude, ' ', varLongitude, ')'))
                )
            )
        ) AS distance
    FROM
        Postcode
    WHERE
        NOT LatLong IS NULL) P
ORDER BY
    Distance
LIMIT
    1;

私が抱えている問題は、クエリの実行に12秒かかることと、結果を得るのにそれほど長い時間がかからないことです。このクエリを確実に高速化できる方法を誰かが考えられますか?

(これがクエリの説明です)

id select_type table      type possible_keys key    key_len ref    rows    Extra
1  PRIMARY     <derived2> ALL  (NULL)        (NULL) (NULL)  (NULL) 1688034 Using filesort
2  DERIVED     Postcode   ALL  LatLong       (NULL) (NULL)  (NULL) 1717998 Using where

距離計算を実行する必要のある初期データ量を絞り込む方法を考えていましたが、特定の郵便番号を見つけることに限定されないものを思い付くことができませんでした。距離。

4

2 に答える 2

1

たぶん、次のようなことを試してみてください。

SELECT Postcode, lat, lon
FROM
(
SELECT Postcode, MAX(latitude) AS lat, MAX(longitude) AS lon
FROM PostCode

-- field name
GROUP BY Postcode 

HAVING MAX(latitude)<varLatitude AND MAX(longitude)<varLongitude

LIMIT 1
) AS temp

これは基本的に、latとlonが指定したものよりも小さいが、varsよりも小さい他のlat/lonの組み合わせよりも大きい郵便番号をもたらします。非常に効果的にあなたの変数に最も近い緯度/経度、したがって最も近い郵便番号。MIN以上を使用して同じことを試すことができ、代わりに逆に進むことができます。

上記では、単一の結果/郵便番号のみが取得されます。緯度/経度の特定の半径で指定された郵便番号のグループを見つけるなど、より優れたものを探している場合は、https://developers.google.com/maps/articles/で説明されている式を参照してください。 phpsqlsearch_v3#findnearsql

于 2012-10-17T13:01:39.960 に答える
0

私はあなたが何を求めているのかについて、ほぼ正確にチュートリアルを書きました。

基本的に、あなたは正しい方向に進んでいます。検索の効率を向上させるには、LatLongフィールドの空間インデックスを利用して行われるGLength()計算の数を減らす必要があります。郵便番号を比較している地点の周囲10マイルのポリゴンなど、検索を絞り込んだ領域に制限すると、クエリがはるかに高速になることがわかります。

于 2013-02-03T23:16:01.370 に答える