2010-12-09 4 views
21

큰 컬렉션 (300k + 레코드)을 저장하기 위해 MongoDB 1.6.3을 사용하고 있습니다. 복합 색인을 추가했습니다. 그러나MongoDB - 인덱스 오류가없는 sort()에 대한 데이터가 너무 많습니다.

db['collection_name'].getIndexes() 
[ 
    { 
     "name" : "_id_", 
     "ns" : "db_name.event_logs", 
     "key" : { 
      "_id" : 1 
     } 
    }, 
    { 
     "key" : { 
      "updated_at.t" : -1, 
      "community_id" : 1 
     }, 
     "ns" : "db_name.event_logs", 
     "background" : true, 
     "name" : "updated_at.t_-1_community_id_1" 
    } 
] 

, 나는이 코드를 실행하려고 : 나는 점점 오전

db['collection_name'] 
    .find({:community_id => 1}) 
    .sort(['updated_at.t', -1]) 
    .skip(@skip) 
    .limit(@limit) 

을 :

몽고 :: OperationFailure (너무 많은 데이터 종류에 대한 을() 아니오 색인 . 색인 추가 또는 더 작은 한도 지정)

내가 뭘 잘못하고 있니?

답변

14

{community_id: 1, 'updated_at.t': -1} 색인을 추가해보세요. 우선 community_id으로 검색 한 다음 정렬해야합니다.

+2

정렬 열은 색인의 마지막 열이어야합니다. http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-1 테세이션 칼럼은 인덱스에서 사용되는 칼럼이어야합니다. –

4

인덱스를 사용하는 것처럼 "느낌"이 들지만 인덱스는 실제로 복합 인덱스입니다. 부분적인 인덱스 만 사용하는 것은 "똑똑하다"는 것이 확실하지 않습니다.

그래서 두 가지 문제 : 조회에

  1. 을 바탕으로, 나는 인덱스가 아닌 두 번째의 첫 번째 부분으로 community_id 둘 것입니다. updated_at.t은 범위 쿼리를 수행 할 필드와 비슷합니다. 범위 쿼리가 두 번째 비트 인 경우 인덱스가 더 잘 작동합니다.
  2. community_id => 1에서 몇 개의 항목을 다시 볼 수 있습니까? 숫자가 크지 않으면 색인없이 정렬 만하면됩니다.

색인을 전환해야 할 수도 있으므로 community_idupdated_at.t을 모두 사용하도록 정렬을 변경해야 할 수 있습니다. 중복되는 것 같습니다.하지만 여전히 시작되지 않으면 Google 그룹스를 확인하십시오.

2

인덱스가있는 경우에도 결과 세트가 4MB를 초과하면 여전히 오류가 발생할 수 있다고 생각합니다.

당신은 MongoDB를 콘솔에 가서이 일을하여 크기를 볼 수 있습니다

:

show dbs 
# pick yours (e.g., production) 
use db-production 
db.articles.stats 

이 같은 결과 결국 :

{ 
"ns" : "mdalert-production.encounters", 
"count" : 89077, 
"size" : 62974416, 
"avgObjSize" : 706.9660630690302, 
"storageSize" : 85170176, 
"numExtents" : 8, 
"nindexes" : 6, 
"lastExtentSize" : 25819648, 
"paddingFactor" : 1, 
"flags" : 1, 
"totalIndexSize" : 18808832, 
"indexSizes" : { 
    "_id_" : 3719168, 
    "patient_num_1" : 3440640, 
    "msg_timestamp_1" : 2981888, 
    "practice_id_1" : 2342912, 
    "patient_id_1" : 3342336, 
    "msg_timestamp_-1" : 2981888 
}, 
"ok" : 1 
} 
0

이 너무 크면 커서 배치 크기를 갖는 이 오류가 발생합니다. 배치 크기를 설정해도 처리 할 수있는 데이터의 양이 제한되지는 않으며 데이터베이스에서 얼마나 많은 데이터를 가져올 수 있는지 만 제한됩니다. 반복을 통해 배치 제한에 도달하면 프로세스가 데이터베이스로 다시 이동합니다.