我有一张可以保存所有英国邮政编码的表格(我认为大约为180万)
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
我一直在尝试一种方法来缩小我必须执行距离计算的初始数据量,但是我无法提出任何不限制在给定范围内查找邮政编码的方法距离。
最佳答案
也许尝试以下方法:
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组合的邮政编码;因此最有效地接近您的var的经/纬度,因此也是最接近的邮政编码。您可以使用MIN和更大的值尝试相同的方法,然后反之亦然。
以上只会给您一个结果/邮政编码。如果您希望获得一些更新颖的东西,例如查找一组以lat / long特定半径给出的邮政编码,那么您应该看看https://developers.google.com/maps/articles/phpsqlsearch_v3#findnearsql中解释的公式
关于mysql - 在MySQL中查找与纬度经度最近的邮政编码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12934746/