2011-02-10 4 views
32

MongoDB에서 $ in 연산자를 사용하는 것이 느려지거나 형편 없습니까?

posts.find({ 
    author : { 
     $in : ['friend1','friend2','friend3'....'friend40'] 
    } 
}) 

App Engine은, 예를 들어, 그들은 IN 배열에 항목 당 직접 하나 개의 쿼리를 번역, 그래서 대신 fan out을 처리하기 위해 자신의 방법을 사용하여에 강제 때문에 30 이상을 사용하지 않습니다. 아마도 Mongo에서 가장 효율적인 방법이지만,이 코드는 훨씬 더 복잡하므로이 일반 메서드를 사용하는 것을 선호합니다.

Mongo는 합리적인 크기의 데이터 세트에 대해 이러한 $ in 쿼리를 효율적으로 실행합니까?

+0

저자 필드에 색인이 있습니까? – shingara

+0

안녕하세요 @Derek Dahmer,이 문제를 극복 할 수 있습니까? 나는이 문제를 다뤘다. 이 아키텍트는 오늘날 MongoDB의 Edge Collection으로 이름지었습니다 :) 저는 거대한 배열을 가진 매개 변수에서 $를 사용하기를 원합니다. 그러나 성능에 유의하십시오! http://image.slidesharecdn.com/socialitept2-140724104718-phpapp01/95/socialite-the-open-source-status-feed-part-2-managing-the-social-graph-18-638.jpg?cb= 1406222239 – efkan

답변

18

$에 대해 작은 목록 (작은 것을 말하기는 어렵지만 적어도 수십/수백은 말할 수 있음)을 사용하면 상당히 효율적일 수 있습니다. mongodb에는 실제 btree 인덱스가 있고 bigtable과 같은 열 스토어가 아니기 때문에 app-engine처럼 작동하지 않습니다.

$를 사용하면 색인을 건너 뛰어 일치하는 문서를 찾거나 사용할 색인이없는 경우 전체 모음을 탐색합니다.

+0

호기심에서, GAE가 각각 별도의 쿼리 일 필요가있는 b-tree와 컬럼 스토어의 차이점은 무엇입니까? GAE도 인덱스를 건너 뛰지 못했습니다. –

+2

글쎄, appengine의 AFAIK 인덱스는 컬럼 스토어 위에 구현됩니다. 즉, 범위 쿼리에 국한되며 btree 구조에서 가능한 한 쉽게 건너 뛸 수 없습니다. Cassandra는 인덱스 데이터를 유지 관리하기 위해 열 저장소를 사용하여 GAE와 동일한 방식으로 작동합니다. –

3

, $in 동작 시간 복잡도는 다음 $(N*log(M)), N 입력 배열의 길이이고 M 컬렉션의 크기이다.

(내가 어떤 DB를 O(N*log(M))을 깰 수 있다고 생각하지 않습니다하지만) 데이터베이스를 변경하지 않는 한 $in 작업의 시간 복잡도가 변경되지 않습니다.

엔지니어링 측면에서 볼 때 N이 큰 숫자 일 경우 비즈니스 논리 서버에 일괄 또는 일대일로 $in 작업을 시뮬레이트하는 것이 좋습니다.

이는 단순히 데이터베이스 서버의 메모리가 비즈니스 로직 서버의 메모리보다 훨씬 더 중요하기 때문입니다.