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

MongoDB 대규모 컬렉션에서 느린 검색? 인덱스 생성으로 해결하는 방법

인덱스 생성으로 검색 성능 개선하기

MongoDB에서 대규모 컬렉션을 다루다 보면 검색 속도가 현저히 느려지는 문제가 발생합니다. 이러한 상황에서 가장 효과적인 해결책은 바로 인덱스(index)를 생성하는 것입니다. 인덱스는 쿼리 실행 시 전체 컬렉션을 스캔하지 않고 필요한 데이터에 빠르게 접근할 수 있도록 도와줍니다.

인덱스 생성에는 createIndex() 메서드를 사용합니다. 아래 예제를 통해 실제 적용 과정을 살펴보겠습니다.

1단계: 인덱스 생성 및 데이터 삽입

먼저 ListOfName 필드에 오름차순(1) 인덱스를 생성한 후, 샘플 문서들을 삽입합니다.

> db.demo661.createIndex({ListOfName:1});
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}
> db.demo661.insertOne({_id:1,ListOfName:["John","Robert","David"]});
{ "acknowledged" : true, "insertedId" : 1 }
> db.demo661.insertOne({_id:2,ListOfName:["Mike","Sam"]});
{ "acknowledged" : true, "insertedId" : 2 }
> db.demo661.insertOne({_id:3,ListOfName:["John","David","Bob"]});
{ "acknowledged" : true, "insertedId" : 3 }

위 실행 결과에서 createdCollectionAutomatically: true는 해당 컬렉션이 존재하지 않아 자동으로 생성되었음을 의미하며, numIndexesAfter: 2는 기본 _id 인덱스에 새 인덱스가 추가되어 총 2개의 인덱스가 되었음을 보여줍니다.

2단계: 저장된 문서 확인하기

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회할 수 있습니다.

> db.demo661.find();

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

{ "_id" : 1, "ListOfName" : [ "John", "Robert", "David" ] }
{ "_id" : 2, "ListOfName" : [ "Mike", "Sam" ] }
{ "_id" : 3, "ListOfName" : [ "John", "David", "Bob" ] }

3단계: $all 연산자로 조건 검색 수행

이제 인덱스가 적용된 상태에서 $all 연산자를 활용해 특정 값들을 모두 포함하는 문서를 조회해 보겠습니다. 아래 쿼리는 ListOfName 배열에 "John"과 "David"가 모두 포함된 문서만 반환합니다.

> db.demo661.find({"ListOfName": {"$all":["John","David"]}});

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

{ "_id" : 1, "ListOfName" : [ "John", "Robert", "David" ] }
{ "_id" : 3, "ListOfName" : [ "John", "David", "Bob" ] }

정리

대규모 컬렉션에서 검색이 느릴 때는 자주 조회하는 필드에 인덱스를 생성하는 것이 핵심입니다. 특히 배열 필드에 인덱스를 생성하면 멀티키(multikey) 인덱스로 동작하여 배열 내 각 요소에 대한 빠른 조회가 가능해집니다. 다만 인덱스는 쓰기 작업 시 약간의 오버헤드를 유발하므로, 실제 쿼리 패턴을 분석한 후 필요한 필드에만 선별적으로 적용하는 것이 좋습니다.