2013-12-11 40 views
0

我有这个查询的一个问题:纬度经度MySQL查询

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万行,而数组和数据库的顺序太重。 任何想法如何我可以修复它?

+0

多久,如果你通过删除由组的顺序和需要吗? – johnny

+0

没有秩序,它只需要它的组0.0097 sek – user3091381

+0

采取组和限制一个子查询,没有太大的区别,但有点我可以说。 – johnny

回答

0

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

0

您使用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

+0

非常感谢。我试过了,但速度也很慢。问题是“按距离排序”声明,这使得我的查询非常缓慢。没有“按距离排序”,速度很快。 – user3091381

+0

我不知道这些答案有多好,但这里有一个与以下几个答案相同的事情以前的帖子:http://stackoverflow.com/questions/16276752/mysql-query-slow-when-using-order-by -with功能到计算距离之间 –