擁有一個擁有超過2000萬行的MySQL表格,Hibernate有一些方法可以構建一個標準,以獲得給定經度和緯度的最近行數?按經度和緯度劃分的休眠標準
使用Criteria
會很好,因爲我需要使用更多的過濾器(價格,類別等)。
最後,它是可行的獲取按距離排序的行?或者行數太多?
擁有一個擁有超過2000萬行的MySQL表格,Hibernate有一些方法可以構建一個標準,以獲得給定經度和緯度的最近行數?按經度和緯度劃分的休眠標準
使用Criteria
會很好,因爲我需要使用更多的過濾器(價格,類別等)。
最後,它是可行的獲取按距離排序的行?或者行數太多?
A計劃隨着大量的行, INDEX(lat)
是一個非首發,性能明智的, 即使有限制的條紋: AND lat BETWEEN 65 AND 69
。 INDEX(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計劃沒有得到 較慢。