네, $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 연산자를 사용하는 것이 권장됩니다.