我有一张超过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秒。太多了。 有没有办法优化它?我做错了什么?
由于
答案 0 :(得分:0)
据我所知,常规关系数据库并不意味着为空间近似查询提供便利。
在您的位置,我要么将数据移动到空间数据库,要么将我的数据插入到度量树中(kd-tree可能是这里的最佳选择)并针对树发出查询。
答案 1 :(得分:0)
你可以试试spatial indices的运气。但是,这将以使用MyISAM存储引擎为代价,