【问题标题】:Latitude Longitude mysql query经纬度mysql查询
【发布时间】: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
  • 采取分组并限制为子查询,差别不大,但我可以说一点。

标签: mysql sql performance geo


【解决方案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

    【讨论】:

    • 非常感谢。我试过了,但它也很慢。问题是“按距离排序”语句,这使我的查询非常慢。如果没有“按距离排序”,它会很快。
    • 我不确定这些答案有多好,但这里有一篇关于同一件事的前一篇文章有​​几个答案:stackoverflow.com/questions/16276752/…
    猜你喜欢
    • 2012-04-19
    • 1970-01-01
    • 2011-06-08
    • 2014-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多