2012-02-01 4 views

답변

2

지형 공간 쿼리에는 고유 한 색인 카테고리가 있으며, geohashing을 사용하면 첫 번째 키 조회의 색인 성능이 크게 향상됩니다. 올바르게 설정하면 범위보다 낫습니다. 어쨌든 당신의 전략은 효과가 있다고 생각합니다. 핵심은 $ maxDistance를 상당히 작게 설정할 것입니다.

나는과 같이, 당신의 설명을 일치하도록 1000 만 개 임의 지리적 기록을 삽입하십시오 maxDistance로

{ "_id" : ObjectId("4f28e1cffc90631d239f8b5a"), "a" : [ 46, 47 ], "b" : ISODate("2012-02-01T06:53:25.543Z"), "c" : 19 } 
{ "_id" : ObjectId("4f28e1bdfc90631d239c4272"), "a" : [ 54, 48 ], "b" : ISODate("2012-02-01T06:53:32.699Z"), "c" : 20 } 
{ "_id" : ObjectId("4f28e206fc90631d23aac59d"), "a" : [ 46, 52 ], "b" : ISODate("2012-02-01T06:55:14.103Z"), "c" : 22 } 
{ "_id" : ObjectId("4f28e1a7fc90631d23995700"), "a" : [ 54, 52 ], "b" : ISODate("2012-02-01T06:52:33.312Z"), "c" : 27 } 
{ "_id" : ObjectId("4f28e1d7fc90631d23a0e9e7"), "a" : [ 52, 46 ], "b" : ISODate("2012-02-01T06:53:11.315Z"), "c" : 31 } 

10 아래 뭔가에 성능이 정말 아주 좋다.

db.test13.find({a:{$near:[50,50], $maxDistance:4}, b:{$gt:d}}).sort({c:1}).explain(); 
{ 
"cursor" : "GeoSearchCursor", 
"nscanned" : 100, 
"nscannedObjects" : 100, 
"n" : 100, 
"scanAndOrder" : true, 
"millis" : 25, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 

} 
} 

maxDistance를 생략하면 꽤 많이 고통 받기 시작합니다. 쿼리 중 일부는 실행하는 데 최대 60 초가 걸렸습니다. 보조 범위 매개 변수는 범위가 상당히 좁은 경우에도별로 도움이되지 않는 것처럼 보입니다. maxDistance에 관한 것 같습니다.

지형 공간 인덱스의 성능에 대한 느낌을 얻기 위해 함께 놀 것을 권장합니다. 여기에 필자의 테스트 삽입 루프가있다. 당신은 http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ에서 언급 한 무슨이 3 상태 어디에 날 귀찮게 무엇 덜 해상도

function getRandomTime() { 
    return new Date(new Date() - Math.floor(Math.random()*1000000)); 
} 

function getRandomGeo() { 
    return [Math.floor(Math.random()*360-180),Math.floor(Math.random()*360-180)]; 
} 

function initialInsert() { 
    for(var i = 0; i < 10000000; i++) { 
     db.test13.save({ 
     a:getRandomGeo(), 
     b:getRandomTime(), 
     c:Math.floor(Math.random()*1000) 
     }); 
    } 
} 
+0

뿐만 아니라 비트를 제한하는 시도 할 수 있습니다. 하나의 열에 대해서만 범위 쿼리 나 정렬을 사용하십시오. – tom

+0

범위 쿼리 중 하나를 추출하는 것이 훨씬 빠릅니다. 그런 식으로 질문해야합니까? –

+0

그래, 주어진 거리 (컬럼 a : 2d, 그리고 엔고가 범위 쿼리라고 가정)와 특정 시간 (컬럼 b : 1) 이후 엔티티를 찾고 다른 컬럼 c : 1에 대해 정렬해야한다. 동일한 결과를 얻는 더 좋은 방법이 있습니까? – tom

관련 문제