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

MongoDB에서 인덱스를 활용해 쿼리 성능을 개선하는 방법

MongoDB에서 특정 필드에 대한 쿼리 성능을 개선하려면 인덱스(Index)를 사용하는 것이 가장 효과적입니다. 인덱스는 데이터 검색 시 전체 컬렉션을 스캔하지 않고도 원하는 문서를 빠르게 찾을 수 있도록 도와줍니다.

이번 글에서는 실제 예제를 통해 컬렉션 생성부터 인덱스 적용, 그리고 인덱스 활용 후의 조회 과정까지 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성

먼저 플레이어 정보를 담은 문서로 구성된 컬렉션을 생성합니다. 아래 명령어를 실행해 보세요.

> db.improveQueryDemo.insertOne(
... {
...     "PlayerDetails":[
...        {"PlayerName": "John", "PlayerGameScore": 5690},
...        {"PlayerName": "Carol", "PlayerGameScore": 2690},
...     ]
... }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9dbaf875e2eeda1d5c3670")
}

2. 전체 문서 조회하기

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

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

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

{
    "_id" : ObjectId("5c9dbaf875e2eeda1d5c3670"),
    "PlayerDetails" : [
        {
            "PlayerName" : "John",
            "PlayerGameScore" : 5690
        },
        {
            "PlayerName" : "Carol",
            "PlayerGameScore" : 2690
        }
    ]
}

3. 인덱스 생성하기

이제 쿼리 성능을 높이기 위해 대상 필드에 인덱스를 생성합니다. ensureIndex() 메서드를 사용하여 PlayerDetails 배열 내부의 PlayerName 필드에 오름차순(1) 인덱스를 만들어 보겠습니다.

> db.improveQueryDemo.ensureIndex({"PlayerDetails.PlayerName":1});

인덱스가 정상적으로 생성되면 다음과 같은 결과가 반환됩니다.

{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

결과를 살펴보면 인덱스 수가 1개에서 2개로 증가한 것을 확인할 수 있습니다. 이는 _id 기본 인덱스 외에 새로운 인덱스가 추가되었음을 의미합니다.

4. 인덱스를 활용한 조건 검색

인덱스가 준비되었으므로 이제 특정 값과 정확히 일치하는 문서를 빠르게 검색할 수 있습니다. PlayerName이 "Carol"인 데이터를 조회해 보겠습니다.

> db.improveQueryDemo.find({"PlayerDetails.PlayerName":"Carol"}).pretty();

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

{
    "_id" : ObjectId("5c9dbaf875e2eeda1d5c3670"),
    "PlayerDetails" : [
        {
            "PlayerName" : "John",
            "PlayerGameScore" : 5690
        },
        {
            "PlayerName" : "Carol",
            "PlayerGameScore" : 2690
        }
    ]
}

정리

MongoDB에서 자주 조회하는 필드에는 반드시 인덱스를 생성하는 것이 좋습니다. 인덱스를 활용하면 대량의 데이터가 있더라도 전체 컬렉션 스캔(Collection Scan)을 피하고 효율적인 인덱스 스캔으로 빠른 응답 속도를 확보할 수 있습니다. 참고로 최신 MongoDB 버전에서는 ensureIndex() 대신 createIndex() 메서드를 사용하는 것이 권장됩니다.