2014-01-22 61 views
1

首先,讓我說明我知道MySQL對於GIS工作並不理想,並且最新版本具有GIS擴展,但我沒有能力使用無論是新的數據庫還是MySQL的新版本,所以我正在做。在MySQL中爲海峽搜索添加邊界的效率

  • 我有一個大的MySQL數據庫,其中包括兩個浮動列lat和lng。
  • 我需要檢索距離點的特定距離內的行,由兩個浮點數lat和lng定義。
  • 我需要了解一下函數的相對(in)效率,以及通過預先計算lat和lng點中的邊界框的可能性。

這裏是我當前的查詢:

SELECT *, 
(3958.762079 * acos(cos(radians(42.2626)) * cos(radians(`lat`)) * cos(radians(`lng`) - radians(-71.8023)) + sin(radians(42.2626)) * sin(radians(`lat`)))) 
AS distance 
FROM `table` WHERE 1=1 AND 
(`lat` >= '40.815284441002' AND `lat` <= '43.709915558998') AND 
(`lng` >= '-73.758118021205' AND `lng` <= '-69.846481978795') 
HAVING distance <= 100 
ORDER BY distance 
LIMIT 100 

它的第一部分是haversine公式(http://en.wikipedia.org/wiki/Haversine_formula)的定義。

然後我有預先計算的範圍。 (使用https://github.com/anthonymartin/GeoLocation.php

最大的問題是,這些邊界是否在運行haversine函數之前或之後進行測試?通過擴展,我是在每個查詢的每一行上運行這個函數,還是僅僅在這些範圍內運行這個函數?

這是一個足夠嚴重的計算值得有界嗎?

回答

0

我想我找到我的答案MySQL文檔中......

http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html

它看起來像「WHERE」子句會首先評估,然後在列的別名(「距離」,在這種情況下, )是爲每個結果計算的,因爲它們被找到,然後運行「GROUP BY()HAVING」(在這裏寫成簡寫「HAVING」),然後應用排序和限制。

所以,在'lat'和'lng'的索引上,最初的WHERE應該運行得非常快。然後,Haversine計算只能在那個小得多的結果集上運行。總而言之,這應該是一個非常有效的解決方案。