Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

명령줄로 MongoDB 데이터베이스의 모든 컬렉션에서 모든 인덱스 한 번에 삭제하는 방법

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()로 현황을 꼭 확인하세요.