查詢 1000 公尺以內的人,資料庫設計和查詢如何實現這個功能?

時間 2021-05-10 01:08:47

1樓:

我的做法是,先用半徑計算出乙個地圖上的正方形區域,經度範圍,維度範圍,然後二者合併sql語句(經度 between 經度最大 and 經度最小, 維度 between 維度最大 and 維度最小),查出放行範圍內的有效結果,程式層面計算得出圓形範圍內的結果,然後輸出給頁面

2樓:馬馳

你是不是去酷狗面試過?他們問過我這麼乙個問題。

我當時的回答跟曹政的差不多,更粗陋一點,說不考慮相鄰的格仔,反正網際網路第一版本嘛,而且這種應用一般人群比較密集,丟了四分之三的鄰居影響不大。 後來又加了「如果使用者在火車上怎麼辦」的條件,我說那就得儲存歷史資料了,計算出一樣移動的鄰居才有意義,不然你讓火車上的使用者找到火車下的鄰居,沒有意義啊。

這個問題挺好的,就是他們給的薪水太低了

3樓:「已登出」

1.用空間索引。

2.不用空間索引的話,提供乙個簡單的思路:

----2.1 按100公尺的精度,用2維的正方形格仔劃分整個世界的經緯度。

----2.2 此時,每個格仔都有自己的精度範圍,與維度範圍。再給每個格仔標記上ID。接著,在資料庫中建立一張表,儲存所有的格仔資訊。

----2.3 建立乙個格仔與使用者的對應關係表,當乙個使用者上線時,把他的位置加入到該格仔系統中去,如果要查1km範圍內的人,就非常直觀方便了,直接數格仔。

----2.4 這個思路可以用稀疏矩陣、圖論、座標對映、包裝盒巢狀等方式去優化。

4樓:戒賢

要麼直接用Mongodb,要麼直接上支援空間搜尋的搜尋引擎比如lucene。方便快捷又效率高。很多做手機定位或者約泡應用都這樣做

5樓:劉斌

建議用MongoDB:

1. 內建geo資料型別,及幾何查詢條件函式;

2. 效能能完全滿足要求;

3. 簡單。

請參考 mongodb中地理位置資訊型別及效能初探 Today is the future,tomorrow is too late.

6樓:曹政

空間索引是正解,但是空間索引對資料儲存引擎有要求和限制,如果你需要擺脫這個限制,或者你對查詢有更多的訴求(比如優先滿足最新有行為的使用者);那麼,我有乙個簡化的處理手段。

簡單說,就是把地理座標歸屬為區塊,比如50公尺*500公尺的塊,或1000公尺*1000公尺的塊,乙個使用者的座標屬於某乙個塊,並且這個塊的標記作為乙個字段,成為資料索引,然後可以根據使用者座標在塊中的位置,查詢時查詢該座標所處塊和相鄰塊的使用者,並在結果中二次排序輸出。 比如使用者座標屬於該區塊左上角,那麼查詢時除了查詢該區塊還分別查詢左區塊,上區塊和左上區塊。

如果我來做,我會用區塊+最後登入時間做復合索引,通常很久之前的使用者座標位置價值不大。這樣在人群密集的區塊可以有效限制搜尋結果集。減少二次排序的壓力。

7樓:mysqlops

MySQL的資料庫儲存引擎:MyISAM支援Geographic型別,並且通過經緯度的範圍進行判斷,至於提問者的要求,預計肯定需要排序的,這個稍微有點麻煩,可以考慮計算出具體的距離值再排序,至於採用資料庫排序還是程式記憶體的方式排序,就要看你系統的使用者量和業務發展的階段。

1.初期為簡便起見就直接資料庫中排序;

2.業務發展到一定時期或使用者量上來,或資料庫的資源成為瓶頸,那麼就必須考慮符合要求的資料讀出之後再使用程式記憶體排序的方式解決較靠譜;

8樓:Luojie

有個很關鍵的地方,就是你要不要對找到的人按距離排序。

不排序,就是用 Between @大石頭的方法

排序的話,就用空間索引。

9樓:李陶冶

MySQL的話用RTree索引,是專門針對這類空間位置做查詢的。Sql Server裡面也有Geographic型別及相關的索引方式,與RTree方式稍有不同的是,Sql Server用的是4叉樹的方式,在點密度不均時效能比RTree稍差一些。

10樓:

看你的資料庫字段如何設計

1.如果將座標點設計成x、y的形式的話相對較麻煩d=111.12cos

是類似這樣的公式,大致上乙個經度之間的距離是111公里,1個維度之間的距離隨著維度的增加而減少,很簡單的三角函式。

2.如果將座標點設計成geometry資料型別的話,據我所知oracle/postgresql等原生支援這種資料型別,而且像第三方的esri等的元件也都提供了這種資料型別。這樣的話,計算距離就更簡單了,直接呼叫內部函式就可以計算兩點間的距離了。

知道如何計算距離了,查詢1km以內的人就應該很簡單了吧。

當然設計上可以更優化一些。

資料庫查詢和讀寫效率

這是我的乙個資料表,大概接近題主所說的百萬級別了。我在一台0.5Core的Xeon E3 1230 v2 256MiB記憶體的VPS上 等同於1600MHz的單核E3 根據AI的id提取出一條資料,耗時是2ms左右。Select 提取出所有字段 而對3個varchar欄位進行全文BOOLEAN MO...

python如何實現查詢sql資料庫並生成html檔案?

IT野狐禪 我推薦的思路是後台僅提供資料出來 如何展示使用前端技術來搞定 許多前端框架可以在頁面先實現好外觀樣式 然後需要後台資料的位置使用佔位符預留好位置,一般叫資料模版 後台查詢資料後,前台的callback函式自動渲染到介面上 web開發中前後臺的分離是必須的 kimmking 使用pytho...

有哪些值得推薦的藥物研發資訊查詢資料庫?

戊戌資料 戊戌資料的中國藥品註冊資料庫剛好能滿足你的需求。中國藥品註冊資料庫整合了SFDA和CDE的資料,申報進度和歷史審批資料都有,更有註冊審評時光軸讓審批進度一目了然。還有訂閱功能,實時監控藥物的研發進度。中國臨床試驗資料庫 並且,戊戌資料的資料都是免費的!免費的!免費的!重要的事情要說三篇。 ...