인덱스 생성으로 검색 성능 개선하기
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) 인덱스로 동작하여 배열 내 각 요소에 대한 빠른 조회가 가능해집니다. 다만 인덱스는 쓰기 작업 시 약간의 오버헤드를 유발하므로, 실제 쿼리 패턴을 분석한 후 필요한 필드에만 선별적으로 적용하는 것이 좋습니다.