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

MongoDB에서 레코드 조회가 느린 이유와 인덱스로 해결하는 방법

MongoDB에서 레코드 조회가 느린 이유는?

MongoDB에서 특정 레코드를 찾는 데 시간이 너무 오래 걸린다면, 대부분의 원인은 인덱스(index)가 없기 때문입니다. 인덱스가 없는 컬렉션에서 쿼리를 실행하면 MongoDB는 조건에 맞는 문서를 찾기 위해 컬렉션의 모든 문서를 처음부터 끝까지 하나씩 확인하는 컬렉션 스캔(Collection Scan)을 수행합니다. 데이터가 수백만 건이라면 이 과정은 매우 비효율적이며 응답 시간이 크게 늘어납니다.

이 문제를 해결하는 핵심 방법은 자주 검색하는 필드에 인덱스를 생성하는 것입니다. 인덱스를 사용하면 마치 책의 목차처럼 원하는 데이터의 위치를 빠르게 찾을 수 있어 조회 속도가 획기적으로 개선됩니다.

1. 인덱스 생성하기

createIndex() 메서드를 사용하면 특정 필드에 인덱스를 만들 수 있습니다. 아래 예제에서는 StudentName 필드에 오름차순(1) 인덱스를 생성합니다.

> db.decreasetimeusingindex.createIndex({"StudentName":1});
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

실행 결과를 보면 numIndexesAfter 값이 2로 증가했습니다. 이는 기본적으로 존재하는 _id 인덱스에 새로운 인덱스가 추가되었음을 의미합니다.

2. 샘플 문서 삽입하기

테스트를 위해 몇 개의 문서를 삽입해 보겠습니다.

> db.decreasetimeusingindex.insertOne({"StudentName":"John Smith","StudentAge":21});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e03960af5e889d7a51994ff")
}
> db.decreasetimeusingindex.insertOne({"StudentName":"John Doe","StudentAge":24});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e039611f5e889d7a5199500")
}
> db.decreasetimeusingindex.insertOne({"StudentName":"Adam Smith","StudentAge":22});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e03961df5e889d7a5199501")
}

3. 전체 문서 조회하기

find() 메서드와 pretty() 메서드를 함께 사용하면 컬렉션의 모든 문서를 보기 좋은 형식으로 출력할 수 있습니다.

> db.decreasetimeusingindex.find().pretty();

위 쿼리는 다음과 같은 결과를 출력합니다.

{
    "_id" : ObjectId("5e03960af5e889d7a51994ff"),
    "StudentName" : "John Smith",
    "StudentAge" : 21
}
{
    "_id" : ObjectId("5e039611f5e889d7a5199500"),
    "StudentName" : "John Doe",
    "StudentAge" : 24
}
{
    "_id" : ObjectId("5e03961df5e889d7a5199501"),
    "StudentName" : "Adam Smith",
    "StudentAge" : 22
}

4. 특정 레코드 조회하기

이제 인덱스가 적용된 필드를 조건으로 특정 레코드를 조회해 보겠습니다.

> db.decreasetimeusingindex.find({"StudentName":"Adam Smith"});

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

{ "_id" : ObjectId("5e03961df5e889d7a5199501"), "StudentName" : "Adam Smith", "StudentAge" : 22 }

추가 팁: explain()으로 성능 확인하기

인덱스가 실제로 사용되고 있는지 확인하려면 explain() 메서드를 활용하세요. 쿼리 실행 계획에서 IXSCAN(인덱스 스캔)이 표시되면 인덱스가 정상적으로 활용된 것이고, COLLSCAN(컬렉션 스캔)이 표시되면 인덱스 없이 전체 문서를 스캔하고 있다는 뜻입니다.

> db.decreasetimeusingindex.find({"StudentName":"Adam Smith"}).explain("executionStats");

정리

  • MongoDB 조회가 느린 가장 흔한 원인은 인덱스 부재로 인한 컬렉션 스캔입니다.
  • createIndex({필드명: 1})로 자주 조회하는 필드에 인덱스를 생성하면 검색 속도가 크게 향상됩니다.
  • 다만 인덱스가 많아지면 쓰기(insert/update/delete) 작업의 오버헤드가 증가하므로, 실제 쿼리 패턴에 맞는 필드만 선별적으로 인덱싱하는 것이 좋습니다.