经纬度mysql查询

Posted

技术标签:

【中文标题】经纬度mysql查询【英文标题】:Latitude Longitude mysql query 【发布时间】:2013-12-29 13:01:24 【问题描述】:

我对这个查询有疑问:

  SELECT city,6371 * ACos( Cos(RADIANS(Lat)) * Cos(RADIANS(51.166698)) * Cos(RADIANS(-1.7833) -   RADIANS(Lng)) + Sin(RADIANS(Lat)) * Sin(RADIANS(51.166698)) ) AS Distance 
  FROM GeoPC 
  GROUP BY city ORDER BY Distance LIMIT 20

查询大约需要 30 秒。数据库中有大约 170 万行,group by 和 order by 对数据库来说太重了。 知道如何解决吗?

【问题讨论】:

去掉order by和group by需要多长时间? 没有顺序和分组只需要0.0097 sek 采取分组并限制为子查询,差别不大,但我可以说一点。 【参考方案1】:

您是否尝试过将距离参数移动到 GeoPC 表中的计算字段?从表面上看,我看不出它有很大的不同,但它很快就可以尝试。

【讨论】:

【参考方案2】:

您使用 Haversine 函数计算 WGS84 大地坐标系中两点之间的距离(例如,lat/lng)。 mysql 支持性能更高的地理空间类型和功能。您将需要用 POINT() 类型的单个字段替换字段 Lat、Lng(我假设它们是十进制类型)。有一些方法可以遍历您的桌子来执行此操作。完成后,您可以使用 MySQL 的地理空间方法来计算两点之间的距离。这是有关该主题的最新博客:

http://www.mysqlperformanceblog.com/2013/10/21/using-the-new-spatial-functions-in-mysql-5-6-for-geo-enabled-applications/

这是有关地理空间类型的 MySQL 在线文档: http://dev.mysql.com/doc/refman/5.0/en/mysql-spatial-datatypes.html

【讨论】:

非常感谢。我试过了,但它也很慢。问题是“按距离排序”语句,这使我的查询非常慢。如果没有“按距离排序”,它会很快。 我不确定这些答案有多好,但这里有一篇关于同一件事的前一篇文章有​​几个答案:***.com/questions/16276752/…

以上是关于经纬度mysql查询的主要内容,如果未能解决你的问题,请参考以下文章

经纬度mysql查询

sql (mysql)怎么实现查询某一个经纬度周围500米距离的餐馆,数据库存放所有餐馆的经纬度?

根据经纬度查询最近距离,mysql查询经纬度附近范围

mysql中如何根据经纬度优化这个距离查询

MYSQL 查询指定范围内的经纬度

Java,Mysql-根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法