私はすべての英国の郵便番号を保持するテーブル郵便番号を持っています(約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
距離計算を実行する必要のある初期データ量を絞り込む方法を考えていましたが、特定の郵便番号を見つけることに限定されないものを思い付くことができませんでした。距離。