加速mysql查询距离(纬度,经度)

时间:2013-12-13 19:13:12

标签: mysql performance distance latitude-longitude geonames

我有一张超过800万条记录(geonames)的表格。在这张桌子里面有19列,其中2列是纬度和经度。

我希望从纬度和经度值中找到最近的地方,我会这样查询:

SELECT * , ( 6371 * ACOS( COS( RADIANS( 40.8333333 ) ) * COS( RADIANS( latitude ) ) * COS( RADIANS( longitude ) - RADIANS( 14.25 ) ) + SIN( RADIANS( 40.8333333 ) ) * SIN( RADIANS( latitude ) ) ) ) AS distance
FROM geoname
WHERE fclass =  'P'
HAVING distance <25
ORDER BY distance
LIMIT 0 , 20

我设置了一个btree索引whit fclass,纬度和经度。

问题是查询需要5.6027秒。太多了。 有没有办法优化它?我做错了什么?

由于

2 个答案:

答案 0 :(得分:0)

据我所知,常规关系数据库并不意味着为空间近似查询提供便利。

在您的位置,我要么将数据移动到空间数据库,要么将我的数据插入到度量树中(kd-tree可能是这里的最佳选择)并针对树发出查询。

答案 1 :(得分:0)

你可以试试spatial indices的运气。但是,这将以使用MyISAM存储引擎为代价,