Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询获取最小距离(最近邻)_Mysql_Performance_Geospatial_Nearest Neighbor - Fatal编程技术网

MySQL查询获取最小距离(最近邻)

MySQL查询获取最小距离(最近邻),mysql,performance,geospatial,nearest-neighbor,Mysql,Performance,Geospatial,Nearest Neighbor,我正在尝试通过以下查询在地理空间数据库中查找GPS坐标(52,14)的最近邻居: SELECT geonameid, SQRT(POW(latitude-52, 2) + POW(longitude-14, 2)) as distance FROM table WHERE latitude >= 52-1 AND latitude <= 52+1 AND longitude >= 14-1 AND longitude <= 14+1 ORDER BY distance A

我正在尝试通过以下查询在地理空间数据库中查找GPS坐标(52,14)的最近邻居:

SELECT
geonameid,
SQRT(POW(latitude-52, 2) + POW(longitude-14, 2)) as distance
FROM table
WHERE
latitude >= 52-1 AND latitude <= 52+1 AND
longitude >= 14-1 AND longitude <= 14+1
ORDER BY distance ASC LIMIT 1
虽然我已经在纬度和经度列上创建了索引,但上面的查询运行速度非常慢(大约60秒:表中有大约340万个条目)

当我忽略按距离排序时,查询速度非常快,但当然不能保证提供最近的邻居

如何提高查询的性能?我认为使用纬度和经度列上的WHERE来限制结果集,确实会大大减少运行时。由于某些原因,它没有,你知道为什么吗?

你可以试试MySQL。您可以对地理查询进行索引和优化。
CREATE TABLE IF NOT EXISTS `table` (
`geonameid` int,
`latitude` DECIMAL(5,2),
`longitude` DECIMAL(5,2),
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
CREATE INDEX g USING BTREE ON table(latitude);
CREATE INDEX b USING BTREE ON table(longitude);