복붙노트

[MONGODB] 몽고는 운영자 성능에 $

MONGODB

몽고는 운영자 성능에 $

그것은 느린 / 가능성의 큰 배열과 MongoDB를에 운영자에 $를 사용하는 가난한 형태는?

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

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

몽고는 적당한 크기의 데이터 세트를 효율적으로 쿼리에서 이러한 $를 실행할 것인가?

해결법

  1. ==============================

    1.그것은 작은 목록과 매우 효율적 (작은이 무엇인지 말을 열심히하지만, 수십 / 수백에 적어도) $에의 할 수 있습니다. MongoDB를 실제 BTREE 인덱스를 가지고에서 Bigtable과 같은 열 저장하지 않기 때문에이 앱 엔진처럼 작동하지 않습니다.

    그것은 작은 목록과 매우 효율적 (작은이 무엇인지 말을 열심히하지만, 수십 / 수백에 적어도) $에의 할 수 있습니다. MongoDB를 실제 BTREE 인덱스를 가지고에서 Bigtable과 같은 열 저장하지 않기 때문에이 앱 엔진처럼 작동하지 않습니다.

    $로 그것은 일치하는 문서를 찾기 위해 인덱스에 주위를 건너 뜁니다에, 또는 사용에 대한 인덱스가없는 경우 전체 컬렉션을 걷는다.

  2. ==============================

    2.사용자가 뷰 알고리즘의 관점에서, 저자 필드 인덱스를 작성한 가정 동작 $의 시간 복잡도는 : $ (N * 로그 (M)) N 입력 배열의 길이이고, M은의 크기, 수집.

    사용자가 뷰 알고리즘의 관점에서, 저자 필드 인덱스를 작성한 가정 동작 $의 시간 복잡도는 : $ (N * 로그 (M)) N 입력 배열의 길이이고, M은의 크기, 수집.

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

    N은 큰 숫자로가는 경우,보기의 엔지니어링 지점에서, 하나 배치 또는 하나씩으로, 동작에 $를 시뮬레이션하는 비즈니스 로직 서버를하도록하는 것이 좋습니다.

    데이터베이스 서버의 메모리가 비즈니스 로직 서버의 메모리보다 훨씬 더 가치 : 이것은 단순히 때문입니다.

  3. ==============================

    3.당신은 목록 요소의 인덱스 (ensureIndex)를 빌드하는 경우, 그것은 꽤 빨리해야합니다.

    당신은 목록 요소의 인덱스 (ensureIndex)를 빌드하는 경우, 그것은 꽤 빨리해야합니다.

    당신은 Explain을 사용하여 시도 해 봤나 ()? 그것의 좋은가 내장 된 방식으로 쿼리를 프로파일 : http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-Use%7B%7Bexplain%7D%7D.

  4. from https://stackoverflow.com/questions/4955160/mongo-in-operator-performance by cc-by-sa and MIT license