纬度经度mysql查询

时间:2013-12-11 13:59:44

标签: mysql sql performance geo

我对此查询有疑问:

  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万行,并且按顺序排序,数据库的顺序太重。 知道如何解决它吗?

2 个答案:

答案 0 :(得分:0)

您是否尝试将Distance参数移动到GeoPC表中的计算字段?从表面上看,我看不出它产生了巨大的差异,但它可以快速尝试。

答案 1 :(得分:0)

使用Haversine函数计算WGS84大地坐标系中两点之间的距离(例如,lat / lng)。 MySQL支持更高性能的地理空间类型和功能。您需要将字段Lat,Lng(我假设为十进制类型)替换为POINT()类型的单个字段。有办法走过你的桌子来做这件事。完成后,您可以使用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