1. MongoDB 복합인덱스
MongoDB 인덱스에서는 여러 필드를 조합하여 인덱스를 만들 수 있다.
이 때 서브필드를 키로 인덱스로 만들 수 있는데 부모필드를 인덱스로 만들때와는 차이가 있다.
2. MongoDB 테스트 버전
유형 | 버전 | 구성 |
mongosh | 2.2.10 | |
mongodb | 7.0.12 | Config : 1개, 포트 20000 Route : 1개, 포트 20001 Shard1 : 1개, 포트 30001 Shard2 : 1개, 포트 40001 |
3. MongoDB 테스트 데이터 적재
부모필드와 서브필드에 다양한 방법으로 데이터를 적재한다.
# field1 와 field2 는 부모필드
# field1_1 와 field1_2 는 field1 의 서브필드
# 데이터 적재
[direct: mongos] indexDB> db.compositeCollection.insert (
{ field1: { field1_1: 123, field1_2: "test" }
, field2 : "2024-07-30" } )
{
acknowledged: true,
insertedIds: { '0': ObjectId('66a8a1676c7cfe6d2f1b157e') }
}
# 데이터 적재 - field1 의 field1_1 / field1_2 서브필드 순서를 반대로 적재
[direct: mongos] indexDB> db.compositeCollection.insert (
{ field1: { field1_2: "test", field1_1: 123 }
, field2 : "2024-07-30" } )
{
acknowledged: true,
insertedIds: { '0': ObjectId('66a8a2a36c7cfe6d2f1b157f') }
}
# 데이터 적재 - field1 의 field1_1 과 field1_2 순서는 동일하지만, 새로운 서브필드를 추가적재
[direct: mongos] indexDB> db.compositeCollection.insert (
{ field1: { field1_1: 123, field1_2: "test", field1_3: "addfield" }
, field2 : "2024-07-30" } )
{
acknowledged: true,
insertedIds: { '0': ObjectId('66a8a4d86c7cfe6d2f1b1580') }
}
4. 복합인덱스 테스트
4-1. 부모필드에 인덱스를 생성하는 경우
부모필드로 생성되는 인덱스는 저장되는 값이 어떤 값이든지 BSON 으로 전환한 다음 하나의 바이트 배열 값으로 판단한다.
그래서 부모필드의 서브 도큐먼트에서 필드의 순서가 변경된다면 다른 바이트 배열이 되기 때문에 다른 값으로 인식한다.
실제로 필드의 순서가 반대로 적재되거나, 다른 서브필드가 있는경우 이 도큐먼트는 조회되지 않는걸 확인할 수 있다.
# 부모필드에 인덱스 생성
[direct: mongos] indexDB> db.compositeCollection.createIndex ( { "field1" : 1 }, { name: "compositeIndex_field1" } )
compositeIndex_field1
# 데이터 조회 ( 필드의 순서가 반대로 적재된 데이터는 조회되지 않음 )
[direct: mongos] indexDB> db.compositeCollection.find( { field1: { field1_1: 123, field1_2: "test"} } )
[
{
_id: ObjectId('66a8a1676c7cfe6d2f1b157e'),
field1: { field1_1: 123, field1_2: 'test' },
field2: '2024-07-30'
}
]
4-2. 서브필드에 인덱스를 생성하는 경우
서브필드 각각에 인덱스를 생성하는 경우, 두개의 필드 값이 각각 인덱스 키 엔트리로 참여하므로
검색 조건에 주어지는 필드의 순서와 관계없이 같은 조건으로 두 도큐먼트를 모두 검색한다.
또한 다른 서브필드가 있더라도 모두 조회가 가능하다.
# 서브필드에 인덱스 생성
[direct: mongos] indexDB> db.compositeCollection.createIndex ( { "field1.field1_1" : 1, "field1.field1_2" : 1 }, { name: "compositeIndex_field1_1_field1_2" } )
compositeIndex_field1_1_field1_2
# 데이터 조회 ( 모두 출력됨 )
[direct: mongos] indexDB> db.compositeCollection.find( { "field1.field1_1": 123, "field1.field1_2": "test" } )
[
{
_id: ObjectId('66a8a1676c7cfe6d2f1b157e'),
field1: { field1_1: 123, field1_2: 'test' },
field2: '2024-07-30'
},
{
_id: ObjectId('66a8a2a36c7cfe6d2f1b157f'),
field1: { field1_2: 'test', field1_1: 123 },
field2: '2024-07-30'
},
{
_id: ObjectId('66a8a4d86c7cfe6d2f1b1580'),
field1: { field1_1: 123, field1_2: 'test', field1_3: 'addfield' },
field2: '2024-07-30'
}
]
4-3. 부모필드와 서브필드에 인덱스를 만들때의 차이점
부모필드로 인덱스를 생성하는 경우 모든 하위값을 BSON 으로 변환한 다음 인덱스 키 엔트리로 사용하지만
서브필드에 인덱스를 생성하는 경우 각각의 필드값을 키 엔트리로 사용한다.
-> 이는 검색의 차이로 나타난다.
부모필드로 인덱스를 생성하는 경우 새로운 서브필드명이 추가되는 순간 인덱스에 참여하게 되지만
서브필드로 인덱스를 생성하는 경우 새로운 서브필드명이 추가되더라도 인덱스에 참여하지 않는다.
'Database > MongoDB 실습' 카테고리의 다른 글
[MongoDB] 샤딩 청크 샤드서버 할당하는 방법 (0) | 2024.07.31 |
---|---|
[MongoDB] 레인지샤딩 범위나누는 방법 (0) | 2024.07.31 |
[MongoDB] 쿼리 실행계획 확인하는 방법 explain (1) | 2024.07.30 |
[MongoDB] 컬렉션에 인덱스 생성, 삭제, 조회 방법 (0) | 2024.07.30 |
[MongoDB] 레인지샤딩 만들기와 메타 조회방법 (0) | 2024.07.29 |