문서 메뉴
문서 홈
/
MongoDB 매뉴얼
/ /

쿼리 선택성을 보장하는 인덱스 만들기

이 페이지의 내용

  • 예제

선택성은 쿼리가 인덱스를 사용하여 결과를 좁힐 수 있는 기능입니다. 효과적인 쿼리는 보다 선택적이며 MongoDB가 쿼리 수행과 관련된 작업의 더 많은 부분에 인덱스를 사용할 수 있도록 합니다.

선택성을 보장하려면 인덱싱된 필드 또는 필드로 가능한 문서 수를 제한하는 쿼리를 작성하세요. 인덱싱된 데이터에 비해 적절하게 선택적인 쿼리를 작성하세요.

다음과 같은 형식의 문서 컬렉션을 고려합니다.

{
status: "processed",
product_type: "electronics"
}

이 예에서 collection에 있는 문서의 99% 중 statusprocessed 입니다. status 에 인덱스를 추가하고 processedstatus 가 있는 문서를 쿼리하는 경우 이 쿼리에서는 인덱스의 선택성이 낮습니다. 그러나 processed status없는 문서를 쿼리하려는 경우 쿼리가 인덱스의 1%만 읽기 때문에 이 인덱스의 선택성이 높습니다.

status 필드에 다음과 같은 세 개의 값이 컬렉션 전체에 분산되어 있는 문서 컬렉션을 예로 들어 보겠습니다.

[
{ _id: ObjectId(), "status": "processed", "product_type": "electronics" },
{ _id: ObjectId(), "status": "processed", "product_type": "grocery" },
{ _id: ObjectId(), "status": "processed", "product_type": "household" },
{ _id: ObjectId(), "status": "pending", "product_type": "electronics" },
{ _id: ObjectId(), "status": "pending", "product_type": "grocery" },
{ _id: ObjectId(), "status": "pending", "product_type": "household" },
{ _id: ObjectId(), "status": "new", "product_type": "electronics" },
{ _id: ObjectId(), "status": "new", "product_type": "grocery" },
{ _id: ObjectId(), "status": "new", "product_type": "household" }
]

status 에 인덱스를 추가하고 { "status": "pending", "product_type": "electronics" } 에 대해 쿼리하는 경우 MongoDB는 3개의 인덱스 키를 읽어야 일치하는 결과를 하나 반환할 수 있습니다. 마찬가지로 { "status": { $in: ["processed", "pending"] }, "product_type" : "electronics" } 에 대한 쿼리는 일치하는 문서 2개를 반환하기 위해 6개의 문서를 읽어야 합니다.

status에 다음과 같은 9개의 값이 컬렉션 전체에 분산되어 있는 문서 컬렉션을 예로 들어 보겠습니다.

[
{ _id: ObjectId(), "status": 1, "product_type": "electronics" },
{ _id: ObjectId(), "status": 2, "product_type": "grocery" },
{ _id: ObjectId(), "status": 3, "product_type": "household"},
{ _id: ObjectId(), "status": 4, "product_type": "electronics" },
{ _id: ObjectId(), "status": 5, "product_type": "grocery"},
{ _id: ObjectId(), "status": 6, "product_type": "household"},
{ _id: ObjectId(), "status": 7, "product_type": "electronics" },
{ _id: ObjectId(), "status": 8, "product_type": "grocery" },
{ _id: ObjectId(), "status": 9, "product_type": "household" }
]

{ "status": 2, "product_type": "grocery" }를 쿼리하면 MongoDB는 쿼리를 수행하기 위해 하나의 문서만 읽습니다. 인덱스와 쿼리는 일치하는 문서가 하나만 있고 쿼리가 인덱스를 사용하여 특정 문서를 선택할 수 있으므로 선택성이 더 높습니다.

이 예제의 status 동등성에 대한 쿼리는 더 쿠제적이지만 { "status": { $gt: 5 }, "product_type": "grocery" }과 같은 쿼리는 여전히 문서 4개를 읽어야 합니다. 하지만 product_typestatus 에 복합 인덱스를 생성하는 경우 { "status": { $gt: 5 }, "product_type": "grocery" }에 대한 쿼리는 문서 2개만 읽으면 됩니다.

선택성을 향상시키기 위해 쿼리가 읽는 문서의 범위를 좁히는 복합 인덱스 를 만들 수 있습니다. 예를 들어 statusproduct_type 에 대한 쿼리의 선택성을 개선하려는 경우 해당 두 필드에 복합 인덱스를 생성할 수 있습니다.

MongoDB가 결과를 반환하기 위해 많은 수의 문서를 읽는 경우, 일부 쿼리는 인덱스 없이 더 빠르게 수행될 수 있습니다. 성능을 확인하려면 인덱스 사용 측정을 참조하세요.

← 인덱스가 RAM에 맞는지 확인

이 페이지의 내용