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

MongoDB에서 $in 연산자가 여러 단일 검색보다 더 빠른 이유

네, $in 연산자를 사용하는 것이 여러 번의 단일 검색을 반복하는 것보다 훨씬 빠릅니다. $in은 하나의 쿼리로 여러 값을 한 번에 조회할 수 있어 네트워크 왕복 횟수와 쿼리 처리 오버헤드를 크게 줄여줍니다. 실제 예제를 통해 확인해 보겠습니다.

예제용 컬렉션 생성

먼저 문서가 포함된 컬렉션을 생성합니다.

> db.demo653.insertOne({subject:"MySQL"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea04b274deddd72997713c0")
}
> db.demo653.insertOne({subject:"MongoDB"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea04b304deddd72997713c1")
}
> db.demo653.insertOne({subject:"Java"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea04b354deddd72997713c2")
}
> db.demo653.insertOne({subject:"C"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea04b384deddd72997713c3")
}
> db.demo653.insertOne({subject:"C++"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea04b3b4deddd72997713c4")
}

find() 메서드로 전체 문서 조회

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

> db.demo653.find();

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

{ "_id" : ObjectId("5ea04b274deddd72997713c0"), "subject" : "MySQL" }
{ "_id" : ObjectId("5ea04b304deddd72997713c1"), "subject" : "MongoDB" }
{ "_id" : ObjectId("5ea04b354deddd72997713c2"), "subject" : "Java" }
{ "_id" : ObjectId("5ea04b384deddd72997713c3"), "subject" : "C" }
{ "_id" : ObjectId("5ea04b3b4deddd72997713c4"), "subject" : "C++" }

$in 연산자를 활용한 빠른 검색

다음은 $in 연산자를 사용하여 여러 값을 한 번의 쿼리로 조회하는 방법입니다. 각 값을 개별적으로 검색하는 것보다 훨씬 효율적입니다.

> db.demo653.find({subject:{$in:["MySQL","C++","C"]}});

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

{ "_id" : ObjectId("5ea04b274deddd72997713c0"), "subject" : "MySQL" }
{ "_id" : ObjectId("5ea04b384deddd72997713c3"), "subject" : "C" }
{ "_id" : ObjectId("5ea04b3b4deddd72997713c4"), "subject" : "C++" }

$in이 더 빠른 이유

$in 연산자가 성능 면에서 유리한 주요 이유는 다음과 같습니다.

1. 네트워크 왕복 최소화: 개별 검색을 3번 수행하면 클라이언트와 서버 간 통신이 3번 발생하지만, $in을 사용하면 단 한 번의 요청으로 모든 결과를 가져올 수 있습니다.

2. 인덱스 효율적 활용: 해당 필드에 인덱스가 있다면 MongoDB는 $in 조건의 모든 값을 인덱스 스캔 한 번으로 처리하여 디스크 접근을 줄입니다.

3. 쿼리 계획 최적화: MongoDB는 하나의 쿼리에 대해 실행 계획을 세우고 캐싱하므로, 반복되는 개별 쿼리보다 전체적인 처리 비용이 낮습니다.

따라서 동일한 필드에서 여러 값을 조회해야 하는 상황이라면, 항상 $in 연산자를 사용하는 것이 권장됩니다.