2011-08-29 133 views
0

我正在計劃一個網站(Drupal/MySQL),它必須根據距離某個位置的距離(我們以大約20,000個位置開始)搜索相當大的數據庫。到目前爲止,我發現在一個合理的方式尋找最佳的解決方案是使用用戶定義函數在SQL來計算座標之間的距離,如:在SQL中用距離搜索

SELECT *, CoordinateDistanceMiles(lat, lon, ${inputLat}, ${inputLon}) as distance 
FROM items WHERE distance < {$radius} 

(使用約翰·戴爾的distance function或類似)

但是,我也讀過UDF的效率很低。我的第二個想法(和設想)是嵌套這樣一來縮小其範圍,因此對項目的更小的子集上運行的UDF,例如內另一個查詢:

SELECT *, CoordinateDistanceMiles(lat, lon, ${inputLat}, ${inputLon}) as distance 
FROM (
    SELECT * FROM items WHERE 
     lat BETWEEN ${inputLat - const} AND ${inputLat + const} AND 
     lon BETWEEN ${inputLon - const} AND ${inputLon + const} 
) WHERE distance < ${radius} 

請問這種模式使搜索更快,還是更復雜?有沒有更好的解決方案?

回答

0

只要您對distance < ${radius}執行掃描,並且有2個基於範圍的比較(它們不能用索引進行優化),那麼在此使用UDF的開銷可以忽略不計。

所以不要擔心UDF「低效率」並使用它,因爲它更具可讀性。