2013-09-23 37 views
0

我有一個先進的MySQL搜索,基於緯度和經度進行半徑搜索。 上次我建立這樣的系統時,查詢的速度有很多問題。 我一直在閱讀,我注意到有些人會選擇它。Mysql在select或where子句中搜索/過濾語句會更快嗎?

SELECT *, (6271 * acos(cos(radians('".$lat."')) * cos(radians(lat)) * cos(radians(long) - radians('".$lng."')) + sin(radians('".$lat."')) * sin(radians(lat)))) AS distance FROM carpark HAVING distance < 15 ORDER BY distance LIMIT 0 , 10";

,或者也可以在where子句中運行它。

Where (6371 * ACOS(COS(RADIANS(".$lat.")) * COS(RADIANS(grt32sg32u_PostCodeData.lat)) * COS(RADIANS(PostCodeData.lon) - RADIANS(".$lon.")) + SIN(RADIANS(".$lat.")) * SIN(RADIANS(PostCodeData.lat)))) <= 15";

那麼,哪一個是更快?他們都是相同的速度還是有差異? 有沒有其他方法可以優化此查詢?

+0

也許把它放在SELECT和WHERE子句中的人需要顯示距離,而只將它放在WHERE子句中的人不需要顯示它。 –

回答

2

我不是一個地理專家,但如果我們假設你有一個大十歲上下的數據庫,你正在做的記錄了大量的數學,這將最終有一個距離> 15

我不t知道哪些(SELECT中的子句或WHERE中的子句)速度更快,但我認爲通過限制條款

返回的結果可以看到更大的性能增益您是否可以簡化爲兩個查詢?相反,計算半徑,怎麼樣(以下僞代碼)

where PostCodeData.lat between $lat - radius and $lat + radius 

這應該很快運行 - 對行沒有數學和緯度和經度可能被索引。

然後,您可以對此結果運行半徑查詢。希望不要看成千上萬的行,你會看到不到十幾個行。

在正方形中搜索點比在圓上搜索點要快得多。這裏的技巧是將搜索範圍縮小到最小的封閉正方形,然後使用半徑(如果您真的需要它)來消除角落中的點。

在一個不相干但重要的筆記上,請檢查您的代碼possible SQL Injection issues

+0

是的,我已閱讀過有關此方法的信息,並計劃與其一起運行。我的經緯度沒有編入索引。我需要組織這個。我無法將它們作爲浮點值運行。 – Shane

+0

Indexing lat&lon可能會產生很大的差異。 –

+0

剛剛做到了。使用varchar。我相信這是我上次犯的一個重大錯誤。 – Shane

相關問題