2015-05-12 63 views
6

擁有一個擁有超過2000萬行的MySQL表格,Hibernate有一些方法可以構建一個標準,以獲得給定經度和緯度的最近行數?按經度和緯度劃分的休眠標準

使用Criteria會很好,因爲我需要使用更多的過濾器(價格,類別等)。

最後,它是可行的獲取按距離排序的行?或者行數太多?

回答

1

A計劃隨着大量的行, INDEX(lat)是一個非首發,性能明智的, 即使有限制的條紋: AND lat BETWEEN 65 AND 69INDEX(lat, lng)是再好不過的,因爲優化器將 不能同時使用的列,即使AND lng BETWEEN...

B計劃你的下一個選擇會涉及緯度和經度,再加上一個子查詢。 而版本5.6將是有益的。這有點像 這個(包括INDEX(lat, lng, id)後):

SELECT ... FROM (
    SELECT id FROM tbl 
     WHERE lat BETWEEN... 
      AND lng BETWEEN...) x 
    JOIN tbl USING (id) 
    WHERE ...; 

由於種種原因,B計劃只比A計劃稍好

C計劃隨着數百萬行的,你需要 my pizza parlor algorithm 。 這涉及一個存儲過程重複探測 表,尋找足夠的行。它還涉及PARTITIONing以獲得粗略的2D索引。 該鏈接具有參考代碼,包括對類別等內容進行過濾。

計劃A和B是O(sqrt(N)); C計劃是O(1)。 也就是說,對於計劃A和計劃B,如果您將行數增加了四倍,則可以使您花費的時間加倍。當你增加N時,C計劃沒有得到 較慢。