0

我有一張表,stores,有數千個商店提供。如果我有每個商店的lat,lngdelivery_radius(我可以添加一個point列),那麼查詢表格以查看哪些商店可以傳遞到我目前所在的位置的最有效方法是什麼?MySQL空間查詢來查找傳送到設定點的所有行

我覺得檢查自己和每行之間的距離是否小於delivery_radius將是一個非常漫長的過程。最好是添加一列來存儲從每行的信息計算出的多邊形,並查看我的當前點是否在該多邊形中(點在多邊形)?還有其他建議嗎?

回答

1

通過在SQL查詢中使用以下代碼段,可以獲得兩個地理點之間的距離。

ROUND((3959 * acos(cos(radians(IFNULL(P1.LAT, 0))) * cos(radians(IFNULL(P2.LAT, 0))) * cos(radians(IFNULL(P2.LNG, 0)) - radians(IFNULL(P1.LNG, 0))) + sin(radians(IFNULL(P1.LAT, 0))) * sin(radians(IFNULL(P2.LAT, 0))))),3) AS DISTANCE 

但是,這是非常昂貴的操作,當數據增長時,您肯定會遇到性能問題。維護多邊形也可能很困難,因爲您必須爲每個新的商店添加更新多邊形,並且數據增長時更新過程將呈指數級減慢。

如果真的不需要在RDMBS上有這樣的功能,請考慮使用其他技術,如本地支持這種操作的elasticsearch。請參考https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-queries.html

+0

我想你可能誤解了多邊形。這不會是包含所有商店的單個多邊形。這將是爲每個商店保存的多邊形。這樣我的當前位置可以與該多邊形進行比較。我的理論是,這消除了爲每個商店創建「可用區域」的計算。這是否會改變你對它的看法? 肯定考慮elasticsearch。 –

+0

我其實很不理解你提到的多邊形概念。只是爲了澄清,你的位置是動態的還是靜態的?添加新商店後多邊形如何受到影響?需求是確定可以交付到您當前位置的商店列表嗎?多邊形如何解決這個問題與新的商店添加? – Aruna

+0

我的位置是動態的,它將根據我的位置創建。我所指的多邊形概念是多邊形概念中的一個要點。我目前的位置是一個點,但我可以將每個商店的投放半徑保存爲一個多邊形。通過查看我的當前點是否位於每個商店的多邊形中而不是計算每個商店之間的距離並查看它是否小於或等於半徑來進行搜索會更快嗎? –