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

MongoDB 쿼리 실행 시간 개선 방법: unique 옵션과 인덱스 활용하기

MongoDB 쿼리 실행 시간 개선: 인덱스 활용하기

MongoDB에서 쿼리 실행 속도를 개선하는 가장 효과적인 방법은 인덱스(Index)를 사용하는 것입니다. 특히 unique:true 옵션과 함께 인덱스를 생성하면 해당 필드 값의 고유성을 보장하는 동시에 검색 성능도 크게 향상시킬 수 있습니다.

아래 예제를 통해 문서가 포함된 컬렉션을 만들고, 인덱스가 쿼리 성능에 어떤 영향을 주는지 살펴보겠습니다.

1단계: 고유 인덱스 생성

createIndex() 메서드를 사용하여 LastName 필드에 오름차순(1) 고유 인덱스를 생성합니다.

> db.demo193.createIndex({"LastName":1},{unique:true});
{
   "createdCollectionAutomatically" : true,
   "numIndexesBefore" : 1,
   "numIndexesAfter" : 2,
   "ok" : 1
}

컬렉션이 자동으로 생성되었으며, 기본 _id 인덱스 외에 새로운 인덱스가 추가되어 총 2개의 인덱스가 존재하게 됩니다.

2단계: 샘플 데이터 삽입

이제 insertOne() 메서드로 여러 개의 문서를 삽입합니다.

> db.demo193.insertOne({"FirstName":"John","LastName":"Doe"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3ade1803d395bdc21346d1")
}
> db.demo193.insertOne({"FirstName":"John","LastName":"Smith"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3ade1f03d395bdc21346d2")
}
> db.demo193.insertOne({"FirstName":"David","LastName":"Miller"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3ade2803d395bdc21346d3")
}

참고: unique:true 옵션이 적용되어 있으므로 동일한 LastName 값을 가진 문서를 삽입하려고 하면 중복 키 오류(Duplicate Key Error)가 발생합니다.

3단계: 전체 문서 조회

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

> db.demo193.find();

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5e3ade1803d395bdc21346d1"), "FirstName" : "John", "LastName" : "Doe" }
{ "_id" : ObjectId("5e3ade1f03d395bdc21346d2"), "FirstName" : "John", "LastName" : "Smith" }
{ "_id" : ObjectId("5e3ade2803d395bdc21346d3"), "FirstName" : "David", "LastName" : "Miller" }

4단계: 빠른 실행 속도로 값 검색하기

이제 인덱스가 설정된 LastName 필드를 조건으로 검색하면 MongoDB는 전체 컬렉션을 스캔하지 않고 인덱스를 통해 대상 문서를 즉시 찾아냅니다.

> db.demo193.find({"LastName":"Smith"});

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

{ "_id" : ObjectId("5e3ade1f03d395bdc21346d2"), "FirstName" : "John", "LastName" : "Smith" }

정리

인덱스를 사용하면 MongoDB가 쿼리 조건에 맞는 문서를 B-Tree 구조의 인덱스를 통해 신속하게 탐색할 수 있어, 컬렉션 규모가 커질수록 그 성능 차이가 더욱 두드러집니다. 자주 검색하는 필드에는 인덱스를 생성하고, 필요에 따라 unique:true 옵션을 함께 적용하여 데이터 무결성까지 확보하는 것이 좋습니다.