1. MongoDB 인덱스
쿼리를 효율적으로 사용하기 위해 MongoDB 는 인덱스를 제공한다.
MongoDB 에서 인덱스 유형은 매우 다양하다.
1-1. MongoDB 인덱스 유형
유형 | 설명 |
단일 필드 인덱스 | 특정 필드에 대한 인덱스 |
복합 인덱스 | 여러 필드를 조합한 인덱스 |
해시 인덱스 | 해시된 값으로 인덱스 |
텍스트 인덱스 | 텍스트 검색을 위한 인덱스 |
2dsphere 인덱스 | 지리공간 데이터에 대한 인덱스 |
유일 인덱스 | 유일한 값만 허용 - 로컬서버 기준에 한정, 샤드서버로 데이터가 분산되는 경우에는 어플리케이션에서 처리 |
2. MongoDB 테스트 버전
유형 | 버전 | 구성 |
mongosh | 2.2.10 | |
mongodb | 7.0.12 | Config : 1개, 포트 20000 Route : 1개, 포트 20001 Shard1 : 1개, 포트 30001 Shard2 : 1개, 포트 40001 |
3. 인덱스 생성
3-1. 인덱스 생성
[direct: mongos] test> use indexDB
switched to db indexDB
# 싱글 인덱스
[direct: mongos] indexDB> db.singleCollection.createIndex( { name : 1 } )
name_1
# 복합 인덱스
[direct: mongos] indexDB> db.compositeCollection.createIndex( { name : 1, address : 1 } )
name_1_address_1
# 해시 인덱스
[direct: mongos] indexDB> db.hashCollection.createIndex( { number : "hashed" } )
number_hashed
# 유니크 인덱스
[direct: mongos] indexDB> db.uniqueCollection.createIndex( { identity : 1 }, { unique : true } )
identity_1
3-2. 백그라운드 생성
인덱스를 생성할 때는 잠금이 발생한다.
이러면 쿼리는 도큐먼트에 접근할 수 없기때문에 백그라운드로 수행하는 옵션을 사용한다.
[direct: mongos] indexDB> db.backCollection.createIndex( { grade : 1 }, { background: true } )
grade_1
3-3. 인덱스 명칭 지정
인덱스에 명칭을 지정하지 않으면 필드명 + 자동증가값이 사용된다.
인덱스에 명칭을 지정하면 지정한 명칭으로 생성된다.
[direct: mongos] indexDB> db.singleCollection.createIndex ( { address : 1 }, { name: "singleCollection_index_address" } )
singleCollection_index_address
[direct: mongos] indexDB> db.singleCollection.getIndexes()
[
{ v: 2, key: { _id: 1 }, name: '_id_' },
{ v: 2, key: { address: 1 }, name: 'singleCollection_index_address' }
]
3-4. 서브필드의 인덱스 생성
도큐먼트 필드는 서브필드를 가질 수 있는데 서브필드에 대해서도 인덱스를 생성할 수 있다.
참고로 서브필드를 가지는 필드에 인덱스를 생성하는 것과, 서브필드에 인덱스를 생성하는 것은 서로 다른 정렬로 동작한다.
[direct: mongos] indexDB> db.subfieldCollection.insert (
{ parentField : { childField1 : 123 , childField2 : "test" }
, parentField2 : "2024-07-30" }
)
DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite.
{
acknowledged: true,
insertedIds: { '0': ObjectId('66a86f9cff05830fb31b157d') }
}
# 서브필드에 인덱스 생성
[direct: mongos] indexDB> db.subfieldCollection.createIndex ( { "parentField1.childField1" : 1, "parentField1.childField2" : 1 } )
parentField1.childField1_1_parentField1.childField2_1
# 부모필드에 인덱스 생성
[direct: mongos] indexDB> db.subfieldCollection.createIndex ( { "parentField1" : 1} )
parentField1_1
4. 인덱스 확인
현재 컬렉션에 인덱스를 확인하려면 getIndexes 를 사용한다.
_id 는 문서의 고유값을 식별하는 MongoDB 내부값으로 인덱스가 기본으로 생성된다.
[direct: mongos] indexDB> db.singleCollection.getIndexes()
[
{ v: 2, key: { _id: 1 }, name: '_id_' },
{ v: 2, key: { name: 1 }, name: 'name_1' }
]
[direct: mongos] indexDB> db.hashCollection.getIndexes()
[
{ v: 2, key: { _id: 1 }, name: '_id_' },
{ v: 2, key: { number: 'hashed' }, name: 'number_hashed' }
]
5. 인덱스 삭제
dropIndex 를 사용하여 인덱스를 삭제한다.
dropIndex ( ) 의 안에는 인덱스 이름을 넣어주면 된다.
[direct: mongos] indexDB> db.singleCollection.dropIndex("name_1")
{
raw: { 'rs1/127.0.0.1:30001': { nIndexesWas: 2, ok: 1 } },
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1722314426, i: 1 }),
signature: {
hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
keyId: Long('0')
}
},
operationTime: Timestamp({ t: 1722314426, i: 1 })
}
[direct: mongos] indexDB> db.singleCollection.getIndexes()
[ { v: 2, key: { _id: 1 }, name: '_id_' } ]
'Database > MongoDB 실습' 카테고리의 다른 글
[MongoDB] 레인지샤딩 범위나누는 방법 (0) | 2024.07.31 |
---|---|
[MongoDB] 복합인덱스 서브필드 구성 조회 테스트 (0) | 2024.07.30 |
[MongoDB] 쿼리 실행계획 확인하는 방법 explain (1) | 2024.07.30 |
[MongoDB] 레인지샤딩 만들기와 메타 조회방법 (0) | 2024.07.29 |
[MongoDB] 해시샤딩 만들기와 메타 조회방법 (0) | 2024.07.29 |