쿼리 선택성을 보장하는 인덱스 만들기
이 페이지의 내용
선택성은 쿼리가 인덱스를 사용하여 결과를 좁힐 수 있는 기능입니다. 효과적인 쿼리는 보다 선택적이며 MongoDB가 쿼리 수행과 관련된 작업의 더 많은 부분에 인덱스를 사용할 수 있도록 합니다.
선택성을 보장하려면 인덱싱된 필드 또는 필드로 가능한 문서 수를 제한하는 쿼리를 작성하세요. 인덱싱된 데이터에 비해 적절하게 선택적인 쿼리를 작성하세요.
예시
많은 공통 값을 지닌 선택성
다음과 같은 형식의 문서 컬렉션을 고려합니다.
{ status: "processed", product_type: "electronics" }
이 예에서 collection에 있는 문서의 99% 중 status
은 processed
입니다. status
에 인덱스를 추가하고 processed
의 status
가 있는 문서를 쿼리하는 경우 이 쿼리에서는 인덱스의 선택성이 낮습니다. 그러나 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_type
및 status
에 복합 인덱스를 생성하는 경우 {
"status": { $gt: 5 }, "product_type": "grocery" }
에 대한 쿼리는 문서 2개만 읽으면 됩니다.
선택성을 향상시키기 위해 쿼리가 읽는 문서의 범위를 좁히는 복합 인덱스 를 만들 수 있습니다. 예를 예시 status
및 product_type
에 대한 쿼리의 선택성을 향상하려는 경우 해당 두 필드에 복합 인덱스 를 만들 수 있습니다.
MongoDB가 결과를 반환하기 위해 많은 수의 문서를 읽는 경우, 일부 쿼리는 인덱스 없이 더 빠르게 수행될 수 있습니다. 성능을 확인하려면 인덱스 사용 측정을 참조하세요.