【问题标题】:Speed up mysql query for distance (latitude,longitude) [duplicate]加快mysql查询距离(纬度,经度)[重复]
【发布时间】:2014-01-01 16:15:45
【问题描述】:

我有一张包含超过 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 秒。太多了。 有没有办法优化它?我做错了什么?

谢谢

【问题讨论】:

  • 第一件事是使用矩形距离示例来区分最大值:WHERE latitude &lt; X AND latitude &gt; Y AND longitude &lt; Z AND longitude &gt; W 您计算一次。这将消除 90-95% 的可能性,并且用真实距离进行细化将花费更少的时间。
  • 谢谢亚历山大。此解决方案可将查询速度提高 0.04 秒! :)

标签: mysql performance distance latitude-longitude geonames


【解决方案1】:

据我所知,常规关系数据库并非旨在为空间近似查询提供便利。

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

【讨论】:

    【解决方案2】:

    您可以通过spatial indices 试试运气。不过,这是以使用 MyISAM 存储引擎为代价的,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 2015-07-16
      • 2011-10-01
      • 1970-01-01
      相关资源
      最近更新 更多