0

我有一张包含超过 800 万条记录(地名)的表。这个表里面有 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

我设置了一个带有 fclass、纬度和经度的 btree 索引。

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

谢谢

4

2 回答 2

0

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

于 2013-12-13T19:28:10.150 回答
0

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

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

于 2013-12-13T19:24:54.917 回答