2013-12-13 40 views
0

我有一個超過8百萬記錄(geonames)的表。這張桌子裏面有19列,其中有2列是經度和緯度。加快mysql距離查詢(緯度,經度)

我希望能夠找到從經緯度值最近的地方,我做這個查詢:

SELECT * , (6371 * ACOS(COS(RADIANS(40.8333333)) * COS(RADIANS(latitude)) * COS(RADIANS(longitude) - RADIANS(14.25)) + SIN(RADIANS(40.8333333)) * SIN(RADIANS(latitude)))) AS distance 
FROM geoname 
WHERE fclass = 'P' 
HAVING distance <25 
ORDER BY distance 
LIMIT 0 , 20 

我設置了B樹索引絲毫FCLASS,經度和緯度。

問題是查詢需要5.6027秒。太多了。 有沒有一種方法來優化它?我做錯了什麼?

感謝

+0

查看[**如何通過經度和緯度計算距離來優化SQL查詢?](http://stackoverflow.com/questions/3093964/how-to-optimize-sql-query-with-calculating-distance-by-longitude-latitude) –

+1

第一件事是用矩形距離來判別最大值例如:WHERE latitude Y,並計算一次經度 W'。這將消除90-95%的可能性,使用真實距離進行細化將花費更少的時間。 –

+0

謝謝亞歷山大。這個解決方案加速到0.04秒查詢! :) – Luca

回答

0

據我所知,常規關係數據庫並不意味着提供了空間近似查詢的功能。您可以將我的數據移動到空間數據庫,或將我的數據插入度量樹(kd-tree可能是此處的最佳選擇),然後針對樹發出查詢。

相關問題