2013-07-18 2 views
0

동료와 아키텍처 토론을하고 이에 대한 답변을 찾아야합니다. 같이 데이터 포인트의 수백만의 집합을 감안할 때 :색인 생성과 읽기 속도 최적화를위한 정규화 비교

data = 
[{ 
    "v" : 1.44, 
    "tags" : { 
     "account" : { 
      "v" : "1055", 
      "name" : "Circle K" 
     } 
     "region" : "IL-East" 
    } 
}, { 
    "v" : 2.25, 
    "tags" : { 
     "account" : { 
      "v" : "1055", 
      "name" : "Circle K" 
     } 
     "region" : "IL-West" 
    } 
}] 

우리가 태그 컬렉션의 필드에 조회 할 필요가 (예를 들어 account.name는 == "서클 K는"여기서), 어떤이있을 것이다 이에 계정 필드를 정상화에 속도 혜택 :

accounts = 
[{ 
    _id : 507f1f77bcf86cd799439011, 
    v: "1055", 
    name : "Circle K" 
}] 

data = 
[{ 
    "v" : 1.44, 
    "tags" : { 
     "account" : 507f1f77bcf86cd799439011 
     "region" : "IL-East" 
    } 
}, { 
    "v" : 2.25, 
    "tags" : { 
     "account" : 507f1f77bcf86cd799439011 
     "region" : "IL-West" 
    } 
}] 

은 내가 이것에 대한 2dB의의를 구축하고 단지 속도의 모습을 볼 수있을 것이다 생각한다. 문제는 mongo가 BSON ID와 문자열을 비교할 때 더 나은가요? 문제의 DB는 약 1:10 쓰기 대 읽기입니다.

+0

B- 트리가 키를 저장하는 방식을 고려할 때이 둘 사이에는 중요한 차이가 있다고 생각하지 않습니다. – WiredPrairie

+0

@ WiredPrairie 내 의혹도있다. 우리는 성능을 극대화해야합니다. 둘 다 테스트해야 할 것입니다. 두 개의 쿼리 대 하나의 쿼리이기 때문에 실제로는 정규화 된 버전이 더 느릴 수도 있습니다. – jcollum

+0

분명히 두 개의 쿼리를 수행하는 것이 다소 느립니다. 나는 당신의'_id' 질문에 대해서만 논평하고있었습니다. – WiredPrairie

답변

1

여기에서 가장 중요한 것은 작업 세트에 충분한 RAM이 있는지 확인하는 것입니다. 여기에는 "tags.account.name"색인 및 예상 검색어 결과 집합을위한 공간이 포함됩니다.

키 크기는 위와 같이 ObjectID-as-string을 사용하면 안됩니다. 크기가 상당히 작기 때문에 실제 ObjectID를 그대로 둡니다. 작은 문서가 많다면 필드 이름을 짧게하는 것에 대해서 생각해 볼 수도 있습니다.

+0

"당신이하지 말아야 할 ObjectID-as-string을 사용합니다."- JSON에서 내 머리 꼭대기를 알지 못했기 때문에 그랬습니다. – jcollum

+0

나는 동의합니다. MongoDB 서버의 RAM 용량, 그리고 'tags.account.name'인덱스가 있는지 확인하십시오.이 태그는 빠른 검색을 위해 필요한 것입니다. –