2013-12-11 139 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功能到計算距離之間 –