Optimization

Yelp 如何有效地計算數據庫中的距離?

  • June 22, 2018

例如,假設我有一張桌子:

Business(BusinessID, Lattitude, Longitude)

當然,所有內容都已編入索引。還有100萬條記錄

假設我想找到最接近 106,5 的商家,例如,我該怎麼做?

如果我做

SELECT *
FROM Business
WHERE (Some formula to compute distance here) < 2000

例如,或者如果我這樣做

SELECT *
FROM Business
TOP 20

理論上,電腦必須計算所有商務的距離,而實際上只有緯度和經度在一定範圍內的商務才需要計算。

那麼我怎樣才能在 PhP 或 SQL 中做我想做的事情呢?

到目前為止,我很感激答案。我正在使用 mysql,他們沒有比明顯的解決方案更有效的方法。MySQL 空間也沒有計算距離功能。

如果我正確理解了這個問題(我不確定我是否正確),您是否擔心"(Some formula to compute distance here)"每次執行查詢時都會計算表中的每一行?

這可以通過使用索引在一定程度上緩解,latitude因此longitude我們只需要計算包含我們實際想要的圓的“盒子”點的距離:

select * from business
where (latitude>96 and latitude<116) and 
     (longitude>-5 and longitude<15) and 
     (Some formula to compute distance here) < 2000

選擇 96、116 等以匹配值“2000”的單位和地球上您計算距離的點。

這使用索引的精確程度將取決於您的 RDBMS 及其規劃者所做的選擇。

一般而言,這是優化一種最近鄰搜尋的原始方式。如果您的 RDBMS 支持GiST 索引,例如postgres ,那麼您應該考慮使用它們。

引用自:https://dba.stackexchange.com/questions/4210