MongoDB 인덱스 재구축이란?
MongoDB에서 컬렉션의 기존 인덱스를 다시 생성해야 할 때는 reIndex() 메서드를 사용합니다. 이 메서드는 해당 컬렉션의 모든 인덱스를 삭제한 뒤 처음부터 새로 구축하므로, 인덱스가 손상되었거나 최적화가 필요한 경우에 유용합니다.
먼저 실습을 위해 데모 컬렉션에 인덱스를 하나 생성해 보겠습니다.
1단계: 인덱스 생성하기
다음 쿼리는 StudentFirstName 필드에 오름차순 인덱스를 생성합니다.
> db.demo42.createIndex({"StudentFirstName":1});위 쿼리를 실행하면 아래와 같은 결과가 출력됩니다.
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}여기서 createdCollectionAutomatically : true는 컬렉션이 존재하지 않아 자동으로 생성되었음을 의미하며, numIndexesAfter : 2는 기본 _id 인덱스에 새로운 인덱스가 추가되어 총 2개의 인덱스가 되었음을 나타냅니다.
2단계: reIndex()로 인덱스 재구축하기
이제 MongoDB에서 인덱스를 재구축하는 쿼리를 실행해 보겠습니다.
> db.demo42.reIndex({"StudentFirstName":1});실행 결과는 다음과 같습니다.
{
"nIndexesWas" : 2,
"nIndexes" : 2,
"indexes" : [
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "web.demo42"
},
{
"v" : 2,
"key" : {
"StudentFirstName" : 1
},
"name" : "StudentFirstName_1",
"ns" : "web.demo42"
}
],
"ok" : 1
}결과 분석
출력 결과를 살펴보면 nIndexesWas와 nIndexes가 모두 2로 표시되어, 재구축 전후로 인덱스 개수에는 변화가 없음을 확인할 수 있습니다. 즉, reIndex()는 인덱스를 추가하거나 삭제하지 않고 기존 인덱스를 그대로 다시 만들어 줍니다.
- _id_ 인덱스: 모든 컬렉션에 기본으로 존재하는 고유 인덱스입니다.
- StudentFirstName_1 인덱스: 앞서 생성한 오름차순(1) 인덱스입니다.
- v : 2: 현재 MongoDB에서 사용하는 인덱스 버전을 의미합니다.
- ns : web.demo42: 인덱스가 속한 데이터베이스와 컬렉션의 네임스페이스입니다.
주의 사항
reIndex()는 컬렉션 전체를 대상으로 동작하며 대량의 데이터가 있는 경우 상당한 시스템 자원과 시간을 소모할 수 있습니다. 또한 복제 세트(replica set) 환경에서는 권장되지 않으므로, 운영 환경보다는 개발·테스트 환경에서 인덱스 문제를 해결할 때 사용하는 것이 좋습니다.