MongoDB를 운영하다 보면 테스트 환경 정리나 성능 문제 해결을 위해 데이터베이스 내 모든 컬렉션의 인덱스를 한꺼번에 삭제해야 하는 경우가 있습니다. 이 글에서는 명령줄(몽고 셸)을 사용해 모든 컬렉션의 인덱스를 일괄 삭제하는 방법을 단계별로 살펴보겠습니다.
모든 인덱스를 삭제하는 기본 문법
다음은 MongoDB 데이터베이스의 모든 컬렉션에서 인덱스를 삭제하는 기본 문법입니다.
db.getCollectionNames().forEach(function(yourVariableName) {
db.runCommand({dropIndexes: yourVariableName, index: "*"});
});이 문법은 getCollectionNames()로 현재 데이터베이스의 모든 컬렉션 이름을 가져온 뒤, 각 컬렉션에 대해 dropIndexes 명령을 실행합니다. 여기서 중요한 점은 _id 인덱스는 삭제되지 않고 그대로 유지된다는 것입니다. _id 인덱스는 MongoDB가 문서를 고유하게 식별하기 위해 필수적으로 사용하는 기본 인덱스이기 때문입니다.
실행 전 확인: 현재 데이터베이스 확인
먼저 작업 대상이 되는 현재 데이터베이스를 확인해 보겠습니다.
> db
실행 결과는 다음과 같습니다.
Test
현재 작업 중인 데이터베이스는 test임을 알 수 있습니다.
삭제 전 인덱스 상태 확인
인덱스를 삭제하기 전에 indexingDemo 컬렉션에 어떤 인덱스가 존재하는지 먼저 확인해 보겠습니다.
> db.indexingDemo.getIndexes();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.indexingDemo"
},
{
"v" : 2,
"key" : {
"StudentFavouriteSubject" : 1
},
"name" : "StudentFavouriteSubject_1",
"ns" : "test.indexingDemo",
"background" : true
}
]현재 두 개의 인덱스가 존재합니다. 하나는 기본 _id 인덱스이고, 다른 하나는 StudentFavouriteSubject 필드에 생성된 사용자 정의 인덱스입니다.
모든 컬렉션의 인덱스 삭제 실행
이제 앞서 소개한 문법을 실제로 적용하여 데이터베이스 내 모든 컬렉션의 인덱스를 삭제해 보겠습니다.
> db.getCollectionNames().forEach(function(allCollectionName) {
... db.runCommand({dropIndexes: allCollectionName, index: "*"});
... });이 명령은 모든 컬렉션을 순회하면서 각 컬렉션의 인덱스를 순차적으로 제거합니다.
삭제 후 결과 검증
인덱스가 실제로 삭제되었는지 다시 한번 확인해 보겠습니다.
> db.indexingDemo.getIndexes();
실행 결과는 다음과 같습니다.
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.indexingDemo"
}
]출력 결과를 보면 StudentFavouriteSubject_1 인덱스가 사라지고 _id 기본 인덱스만 남아 있는 것을 확인할 수 있습니다. 즉, 사용자가 생성한 인덱스들이 성공적으로 모두 삭제된 것입니다.
정리 및 주의사항
이 방법은 여러 컬렉션의 불필요한 인덱스를 빠르게 정리할 때 매우 유용합니다. 다만 프로덕션 환경에서 실행할 경우에는 다음 사항에 유의해야 합니다.
- 인덱스를 삭제하면 해당 쿼리들의 조회 성능이 크게 저하될 수 있습니다.
- 삭제된 인덱스는 자동으로 복구되지 않으므로, 실행 전 반드시 백업하거나 인덱스 생성 스크립트를 따로 보관해 두는 것이 좋습니다.
- 시스템이 필요로 하는 인덱스까지 삭제하지 않도록, 실행 전 getIndexes()로 현황을 꼭 확인하세요.