我正在尝试使用以下查询在地理空间数据库中找到与 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
该表是通过以下方式创建的:
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);
尽管我在纬度和经度列上都创建了索引,但上述查询运行速度非常慢(~60 秒:表有大约 340 万个条目)。
当我省略按距离排序时,查询速度非常快,但当然不能保证给我最近的邻居。
如何提高查询的性能?我认为在纬度和经度列上使用 WHERE 来限制结果集确实会减少运行时间。由于某种原因它没有,你知道为什么吗?