2013-02-15 2 views
2

mongoDB 컬렉션의 모든 문서에는 정수 배열이 있습니다. 각 정수마다 32 비트 이상을 필요로하지 않으며 정수 배열의 길이는 각 문서에서 동일합니다.mongoDB는 많은 정수 배열을 저장하는 데 비효율적입니까?

내 응용 프로그램의 클라이언트는 배열 내의 개별 필드를 자주 업데이트합니다.

256 개 정수 배열을 가진 5000-10000 건의 문서가 있으면 mongo db 낭비 공간이 생깁니다. 내 배열의 내용을 정수가 아닌 데이터 유형으로 변경하거나 배열의 길이를 변경해야하기 때문입니다 ?

mongoDB의 디자인으로 내 배열 내의 개별 정수를 기존 관계형 데이터베이스와 비교할 때 매우 비효율적으로 업데이트 할 수 있습니까? 그것은 나를 정수가 아닌 데이터 유형 또는 내 배열의 내용을 변경하기 위해 준비해야하기 때문 http://docs.mongodb.org/manual/applications/update/#update-arrays

+0

수정하면 문서가 커져서 이전의 다른 공간에서 이동해야합니까? – Sammaye

+0

@Sammaye no. 모든 단일 배열은 항상 다른 모든 배열과 정확히 동일한 길이입니다. 이 질문의 예제에서 각 배열의 길이는 256입니다. 배열과 다른 필드를 포함하여 문서의 전체 크기도 변경되지 않습니다. –

+1

업데이트의 가장 큰 문제점은 이동 문제입니다. 이러한 문제가 발생하지 않는다고 생각하면 하위 문서에 두드리는 것이 좋을 것입니다. 특히 배열의 256 개 요소이므로 여기서는 좋은 성능을보아야합니다. 메모리 연산자에로드해야합니다. $ pull 등 매우 빠름 – Sammaye

답변

1

는 DB 폐기물 공간을 몽고됩니다

가정은 여기 설명하는 업데이트 배열 구문을 사용하고 있습니다 배열의 길이를 변경 하시겠습니까?

아니요. 공간을 낭비하지 않습니다. 데이터 유형을 변경하거나 배열 길이를 변경하는 능력에 대해 생각하기보다는 MongoDB의 padding factor에 집중하여 문서가 성장하는 경향이 있는지 여부를 적응 적으로 학습합니다. 문서 크기가 매우 유사하므로 채우기 비율이 1 (즉, 문서 크기에 추가되는 여백이 거의 없음)이됩니다.

전통적인 관계형 데이터베이스와 비교할 때 mongoDB를 사용하면 배열 내의 개별 정수를 매우 효율적으로 업데이트 할 수 있습니까?

임베디드 어레이에는 정확한 관계형이 없으므로 비교가 명확하지 않습니다. 관계형이 JOIN으로 가정합니다. 이 경우, JOIN에는 자체 비용이 들기 때문에 MongoDB가 더 빨리 작동 할 것이라고 나는 믿는다. 추가 참고로


, 5,000 ~ 10,000 문서를 처리 할 수있는 데이터 MongoDB를의 볼륨 주어진 조금만이다. 업데이트에서 인덱싱 된 조건 (예 : _id)을 지정하는 한 여기에서 걱정할 공간이나 성능 고려 사항이 없습니다. 그러나 당신의 문서가 작지 않기 때문에, 내가 찾던 한 가지 방법은 찾기 쿼리에서 전체 문서를 한번에로드하려고 시도하는 것입니다. 특정 필드에 대해서만 project find queries을 선호 할 수 있습니다. 배열을 쿼리 할 때 $slice을 고려할 수 있습니다.

+0

배열 연산이 메모리에 있고 JOIN 연산이 인덱스에 있기 때문에 성능 측면에서 약간 비교 가능합니다. – Sammaye

+0

@Sammaye 감사합니다. 저는 답변을 업데이트했습니다. 나는 그것이 효율성 측면에서 명백한 비교라고 생각하지 않는다. 그러나 특정 시나리오를 기반으로 그것이 관계형보다 빠르다 고 생각합니까? –

+2

사실,이 특정 시나리오는 작업 집합에 배열을로드하고 디스크의 해당 위치 업데이트에 JOIN의 범위 인덱스보다 조작하는 것이 더 빠를 것입니다. – Sammaye

관련 문제