Docs Menu
Docs Home
/
데이터베이스 매뉴얼
/ /

쿼리에 효율적으로 답변할 수 있는 선택적 인덱스 생성하기

선택도는 컬렉션 에 있는 총 문서 수와 일치하는 문서의 쿼리 을 설명하는 쿼리 속성 입니다. 인덱스 의 선택성은 고유 인덱스 키가 일치하는 문서의 수를 나타냅니다. 쿼리 또는 지정된 인덱스 키와 일치하는 문서가 상대적으로 거의 없을 때 쿼리 또는 인덱스 의 선택성이 높습니다.

인덱스는 사용된 인덱스 키에 따라 선택성이 다를 수 있으므로 쿼리 에 포함된 조건자를 기반으로 가장 선택적인 인덱스를 사용할 수 있는지 확인합니다. 가장 효율적인 쿼리 실행을 보장하려면 쿼리 에 포함된 조건자와 가장 고유하게 일치하는 인덱스를 생성합니다.

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

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

이 예시 에서 컬렉션 에 있는 문서의 99% 중 statusprocessed입니다. status 에 인덱스 추가하고 statusprocessed인 문서를 쿼리 인덱스 와 쿼리 모두 선택도가 낮아집니다. 그러나 status 의 이 processed 없는 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개의 인덱스 키를 읽고 해당 상태와 일치하는 문서 3개를 조회 product_type 에서 해당 문서를 추가로 필터하다 일치하는 문서 1개를 반환해야 합니다. 마찬가지로, { "status": {$in: ["processed", "pending"] }, "product_type" : "electronics" } 에 대한 쿼리 일치하는 두 문서를 반환하기 위해 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 인덱스 키와 일치하는 문서 하나만 읽으므로 인덱스 매우 선택적임을 나타냅니다. 이 인덱스 사용하면 MongoDB 인덱스 값과 일치하는 하나 문서 만 추가로 필터하다 해야 하므로 쿼리 응답을 보다 효율적으로 받을 수 있습니다. 이 경우 필터하다 도 일치하며 쿼리 하나 문서 만 반환합니다.

이 예제의 status 동등성에 대한 쿼리 더 선택적이지만 { "status": { $gt: 5 }, "product_type": "grocery" } 와 같은 쿼리 status에 동일한 인덱스 사용하는 경우 여전히 4개의 문서를 읽어야 합니다. 그러나 product_typestatus 에 복합 인덱스 생성하는 경우, 쿼리 일치하는 문서 하나만 반환하므로 MongoDB 복합 인덱스 통해 {"status": { $gt: 5 }, "product_type": "grocery" } 에 대한 쿼리 에 더 효율적으로 답변 할 수 있습니다.

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

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

돌아가기

쿼리 결과 정렬

이 페이지의 내용