经纬度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查询的主要内容,如果未能解决你的问题,请参考以下文章