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

MongoDB 인덱스 - 단일 인덱스와 복합 인덱스를 동시에 생성할 수 있을까?

MongoDB에서 인덱스 동시 생성이 가능할까?

결론부터 말하면 가능합니다. MongoDB는 문서 컬렉션 내 어떤 필드에 대해서도 인덱스 생성을 완벽하게 지원합니다. 이때 ensureIndex() 메서드를 활용하면 단일 인덱스와 복합(Compound) 인덱스를 한 번에 정의하고 생성할 수 있습니다.

참고로 최신 버전의 MongoDB에서는 ensureIndex()가 deprecated(더 이상 권장되지 않음) 상태이므로, 실무 환경에서는 동일한 역할을 하는 createIndex() 사용을 권장합니다.

컬렉션 생성 및 복합 인덱스 만들기

먼저 여러 필드에 걸친 복합 인덱스를 생성해 보겠습니다.

> db.demo622.ensureIndex({_id:1, Name:1, Age:1});
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

위 실행 결과에서 createdCollectionAutomatically: true는 해당 이름의 컬렉션이 존재하지 않아 자동으로 생성되었음을 의미합니다. 또한 기존의 _id 인덱스 외에 새로운 복합 인덱스가 추가되어 인덱스 개수가 1개에서 2개로 늘어난 것을 확인할 수 있습니다.

문서 삽입하기

이제 insertOne() 메서드로 샘플 데이터를 삽입합니다.

> db.demo622.insertOne({_id:101, Name:"Chris", Age:21});
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo622.insertOne({_id:102, Name:"Chris", Age:22});
{ "acknowledged" : true, "insertedId" : 102 }
> db.demo622.insertOne({_id:103, Name:"Bob", Age:21});
{ "acknowledged" : true, "insertedId" : 103 }
> db.demo622.insertOne({_id:104, Name:"Chris", Age:22});
{ "acknowledged" : true, "insertedId" : 104 }

중복 키 오류 살펴보기

만약 이미 존재하는 _id 값으로 문서를 다시 삽입하면 어떻게 될까요? 아래 예시처럼 E11000 중복 키 오류가 발생합니다.

> db.demo622.insertOne({_id:104, Name:"Chris", Age:22});
2020-04-18T12:21:18.085+0530 E QUERY [js] WriteError: E11000 duplicate key error 
collection: test.demo622 index: _id_ dup key: { : 104.0 } :
WriteError({
    "index" : 0,
    "code" : 11000,
    "errmsg" : "E11000 duplicate key error collection: test.demo622 index: _id_ dup key: { : 104.0 }",
    "op" : {
        "_id" : 104,
        "Name" : "Chris",
        "Age" : 22
    }
})

이 오류는 _id 필드가 기본적으로 고유(unique) 인덱스로 설정되어 있기 때문에 발생합니다. 동일한 _id 값을 가진 문서는 하나만 존재할 수 있으므로, 중복 삽입 시도는 거부됩니다. 이후 새로운 ID로 다시 삽입하면 정상 처리됩니다.

> db.demo622.insertOne({_id:105, Name:"Chris", Age:22});
{ "acknowledged" : true, "insertedId" : 105 }

저장된 문서 조회하기

마지막으로 find() 메서드를 사용하여 컬렉션 내 모든 문서를 출력해 보겠습니다.

> db.demo622.find();

실행 결과는 다음과 같습니다.

{ "_id" : 101, "Name" : "Chris", "Age" : 21 }
{ "_id" : 102, "Name" : "Chris", "Age" : 22 }
{ "_id" : 103, "Name" : "Bob", "Age" : 21 }
{ "_id" : 104, "Name" : "Chris", "Age" : 22 }
{ "_id" : 105, "Name" : "Chris", "Age" : 22 }

정리

MongoDB에서는 ensureIndex()(또는 createIndex())를 사용하여 단일 필드 인덱스와 여러 필드를 조합한 복합 인덱스를 자유롭게 생성할 수 있습니다. 복합 인덱스를 활용하면 여러 조건을 함께 사용하는 쿼리의 성능을 크게 향상시킬 수 있으며, 인덱스 순서는 쿼리 최적화에 중요한 영향을 미치므로 설계 시 신중하게 고려하는 것이 좋습니다.