클러스터형 컬렉션
이 페이지의 내용
버전 5.3에 추가.
클러스터형 컬렉션은 인덱스된 문서를 인덱스 사양과 동일한 WiredTiger 파일에 저장합니다. 컬렉션의 문서와 인덱스를 같은 파일에 저장하면 일반 인덱스에 비해 스토리지 및 성능 측면에서 이점이 있습니다.
클러스터된 컬렉션은 클러스터된 인덱스를 사용하여 생성됩니다. 클러스터형 인덱스는 문서가 저장되는 순서를 지정합니다.
클러스터형 컬렉션을 만들려면 예시를 참조하세요.
중요
이전 버전과 호환되지 않는 기능
5.3 이전의 MongoDB 버전으로 다운그레이드하려면 먼저 클러스터형 컬렉션을 제거해야 합니다.
혜택
클러스터된 컬렉션은 클러스터되지 않은 컬렉션에 비해 다음과 같은 이점이 있습니다.
클러스터형 인덱스 키에 대한 범위 스캔 및 동일성 비교 쿼리와 같이 보조 인덱스 없이도 클러스터형 컬렉션에 대한 쿼리를 더 빠르게 수행할 수 있습니다.
클러스터형 컬렉션은 저장소 크기가 작기 때문에 쿼리 및 대량 삽입의 성능이 향상됩니다.
클러스터형 컬렉션은 세컨더리 TTL(Time To Live) 인덱스가 필요하지 않습니다.
클러스터형 인덱스는 expireAfterSeconds 필드를 지정하는 경우 TTL 인덱스이기도 합니다.
TTL 인덱스로 사용하려면
_id
필드가 지원되는 날짜 유형이어야 합니다. TTL 인덱스를 참조하세요.클러스터형 인덱스를 TTL 인덱스로 사용하면 문서 삭제 성능이 향상되고 클러스터형 컬렉션 스토리지 크기가 줄어듭니다.
클러스터형 컬렉션에는 삽입, 업데이트, 삭제 및 쿼리에 대한 성능이 추가로 향상되었습니다.
모든 collection에는 _id 인덱스가 있습니다.
비클러스터형 컬렉션은
_id
인덱스를 문서와 별도로 저장합니다. 이를 위해서는 삽입, 업데이트 및 삭제를 위해 두 번의 쓰기가 필요하고 쿼리를 위해 두 번의 읽기가 필요합니다.클러스터형 컬렉션은 인덱스와 문서를
_id
값 순서로 함께 저장합니다. 이 경우 삽입, 업데이트, 삭제에 쓰기 작업 한 번, 쿼리를 위해 읽기 작업 한 번이 필요합니다.
행동
클러스터형 컬렉션은 클러스터형 인덱스 키 값을 기준으로 정렬된 문서를 저장합니다. 클러스터형 인덱스 키는 { _id: 1 }
(이어)여야 합니다.
문서는 하나의 순서로만 저장할 수 있으므로 컬렉션에는 클러스터형 인덱스가 하나만 있을 수 있습니다. 클러스터형 인덱스를 사용하는 컬렉션만이 데이터를 정렬된 순서로 저장합니다.
클러스터형 컬렉션에 클러스터형 인덱스와 함께 보조 인덱스를 추가할 수 있습니다. 클러스터형 인덱스는 보조 인덱스와 다릅니다:
클러스터형 인덱스는 컬렉션을 만들 때만 만들 수 있습니다.
클러스터형 인덱스 키는 collection과 함께 저장됩니다.
collStats
명령이 반환하는 collection 크기에는 클러스터형 인덱스 크기가 포함됩니다.
MongoDB 6.0.7부터 사용 가능한 클러스터형 인덱스가 있는 경우 MongoDB 쿼리 플래너는 쿼리 계획 프로세스에서 보조 인덱스에 대해 클러스터형 인덱스를 평가합니다. 쿼리가 클러스터된 인덱스를 사용하는 경우, MongoDB는 제한된 컬렉션 스캔을 수행합니다.
MongoDB 6.0.7 이전에는 클러스터형 컬렉션에 보조 인덱스가 존재하고 쿼리에서 보조 인덱스를 사용할 수 있는 경우, 기본 설정에 따라 쿼리 플래너가 클러스터형 인덱스 대신 보조 인덱스를 선택했습니다. MongoDB 6.1 이전 버전에서는 클러스터형 인덱스를 사용하려면 쿼리 옵티마이저가 클러스터형 인덱스를 자동으로 선택하지 않으므로 힌트를 제공해야 합니다.
제한 사항
클러스터형 컬렉션 제한:
클러스터형 인덱스 키는
{ _id: 1 }
이어야 합니다.비클러스터형 컬렉션을 클러스터형 컬렉션으로 변환하거나 그 반대로 변환할 수 없습니다. 대신 다음을 수행할 수 있습니다.
하나의 컬렉션에서 문서를 읽고 다른 컬렉션에 이를 쓰려면
$out
단계 또는$merge
단계에서 집계 파이프라인을 사용합니다.mongodump
를 사용하여 컬렉션 데이터를 내보내고mongorestore
를 사용하여 다른 컬렉션으로 데이터를 가져옵니다.
클러스터형 인덱스는 숨길 수 없습니다. 숨겨진 인덱스를 참조하세요.
클러스터형 컬렉션에 대한 보조 인덱스가 있는 경우 컬렉션의 스토리지 크기가 더 큽니다. 이는 클러스터형 인덱스 키가 큰 클러스터형 컬렉션의 보조 인덱스가 비클러스터형 컬렉션의 보조 인덱스보다 저장 공간 크기가 더 클 수 있기 때문입니다.
클러스터형 컬렉션은 고정 사이즈 컬렉션일 수 없습니다.
자체 클러스터형 인덱스 키 값 설정
기본적으로 클러스터형 인덱스 키 값은 고유한 문서 객체 식별자입니다.
클러스터형 인덱스 키 값을 직접 설정하다 수 있습니다. 키 값은 _id 필드 의 표준 제약 조건을 따라야 합니다.
또한 다음 방법을 사용하여 성능을 최적화하세요.
순차적으로 증가하는 키 값을 사용하여 삽입 성능을 개선합니다.
인덱스 키를 가능한 한 작은 크기로 설정합니다.
클러스터형 인덱스는 최대 8MB 크기의 키를 지원하지만 훨씬 작은 클러스터형 인덱스 키가 가장 좋습니다.
키가 크면 클러스터형 컬렉션 과 해당 세컨더리 인덱스의 저장 크기가 늘어나 클러스터형 컬렉션 성능이 저하됩니다.
경고
무작위로 생성된 키 값은 클러스터된 컬렉션의 성능을 저하시킬 수 있습니다.
예시
이 섹션에서는 클러스터형 컬렉션의 예를 보여줍니다.
Create
예시
다음 create
예시에서는 products
(이)라는 클러스터형 컬렉션을 추가합니다.
db.runCommand( { create: "products", clusteredIndex: { "key": { _id: 1 }, "unique": true, "name": "products clustered key" } } )
이 예시에서 clusteredIndex는 다음을 지정합니다.
"key": { _id: 1 }
,_id
필드에 클러스터형 인덱스 키 값이 설정됩니다."unique": true
, 클러스터형 인덱스 키 값이 고유해야 함을 표시합니다."name": "products clustered key"
, 클러스터형 인덱스 이름을 설정합니다.
db.createCollection
예시
다음 db.createCollection()
예시에서는 stocks
(이)라는 클러스터형 컬렉션을 추가합니다.
db.createCollection( "stocks", { clusteredIndex: { "key": { _id: 1 }, "unique": true, "name": "stocks clustered key" } } )
이 예시에서 clusteredIndex는 다음을 지정합니다.
"key": { _id: 1 }
,_id
필드에 클러스터형 인덱스 키 값이 설정됩니다."unique": true
, 클러스터형 인덱스 키 값이 고유해야 함을 표시합니다."name": "stocks clustered key"
, 클러스터형 인덱스 이름을 설정합니다.
날짜 클러스터형 인덱스 키 예시
다음 create
예시에서는 orders
이라고 명명된 클러스터된 컬렉션을 추가합니다:
db.createCollection( "orders", { clusteredIndex: { "key": { _id: 1 }, "unique": true, "name": "orders clustered key" } } )
이 예시에서 clusteredIndex는 다음을 지정합니다.
"key": { _id: 1 }
,_id
필드에 클러스터형 인덱스 키 값이 설정됩니다."unique": true
, 클러스터형 인덱스 키 값이 고유해야 함을 표시합니다."name": "orders clustered key"
, 클러스터형 인덱스 이름을 설정합니다.
다음 예시는 orders
collection에 문서를 추가합니다:
db.orders.insertMany( [ { _id: ISODate( "2022-03-18T12:45:20Z" ), "quantity": 50, "totalOrderPrice": 500 }, { _id: ISODate( "2022-03-18T12:47:00Z" ), "quantity": 5, "totalOrderPrice": 50 }, { _id: ISODate( "2022-03-18T12:50:00Z" ), "quantity": 1, "totalOrderPrice": 10 } ] )
_id
clusteredIndex 키는 주문 날짜를 저장합니다.
범위 쿼리에서 _id
필드를 사용하면 성능이 향상됩니다. 예를 들어, 다음 쿼리는 _id
와 $gt
를 사용하여 주문 날짜가 제공된 날짜보다 큰 주문을 반환합니다.
db.orders.find( { _id: { $gt: ISODate( "2022-03-18T12:47:00.000Z" ) } } )
출력 예시:
[ { _id: ISODate( "2022-03-18T12:50:00.000Z" ), quantity: 1, totalOrderPrice: 10 } ]
컬렉션이 클러스터링되었는지 확인
컬렉션이 클러스터링되었는지 확인하려면 listCollections
명령을 다음과 같이 사용하세요.
db.runCommand( { listCollections: 1 } )
클러스터형 컬렉션의 경우 출력에 clusteredIndex 세부 정보가 표시됩니다. 예를 들어, 다음 출력은 orders
클러스터형 컬렉션에 대한 세부 정보를 보여줍니다.
... name: 'orders', type: 'collection', options: { clusteredIndex: { v: 2, key: { _id: 1 }, name: 'orders clustered key', unique: true } }, ...
v
, 인덱스 버전입니다.