부분 인덱스 - Amazon DocumentDB

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

부분 인덱스

부분 색인은 지정된 필터 기준을 충족하는 컬렉션의 문서를 색인화합니다. 부분 인덱스 기능은 Amazon DocumentDB 5.0 인스턴스 기반 클러스터에서 지원됩니다.

부분 인덱스 생성

부분 색인을 만들려면 partialFilterExpression 옵션과 함께 createIndex() 메서드를 사용하십시오. 예를 들어, 다음 작업은 a가 OrderID 있고 isDelivered 필드가 true인 문서를 인덱싱하는 order 컬렉션에 고유한 복합 색인을 만듭니다.

db.orders.createIndex( {"category": 1, "CustomerId": 1, "OrderId": 1}, {"unique": true, "partialFilterExpression": {"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]} } )

지원되는 연산자

  • $eq

  • $exists

  • $and (최상위 레벨에만 해당)

  • $gt/$gte/$lt/$lte (인덱스 스캔은 쿼리에 정의된 필터가 부분 필터 표현식과 정확히 일치하는 경우에만 사용됩니다.) (제한 사항 참조)

부분 인덱스를 사용한 쿼리

부분 인덱스를 사용하면 다음과 같은 쿼리 패턴을 사용할 수 있습니다.

  • 쿼리 조건자는 부분 인덱스 필터 표현식과 정확히 일치합니다.

    db.orders.find({"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]}).explain()
  • 쿼리 필터의 예상 결과는 부분 필터의 논리적 하위 집합입니다.

    db.orders.find({"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}}, {"OrderAmount": {"$eq": "5"}} ]}).explain()
  • 쿼리의 하위 조건자를 다른 인덱스와 함께 사용할 수 있습니다.

    db.orders.createIndex({"anotherIndex":1}) db.orders.find({ "$or": [ {"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]}, {"anotherIndex": {"$eq": 5}} ] }).explain()
참고

쿼리 플래너는 효율적인 경우 인덱스 스캔 대신 컬렉션 스캔을 사용하도록 선택할 수 있습니다. 이는 일반적으로 매우 작은 컬렉션이나 컬렉션의 많은 부분을 반환하는 쿼리에서 나타납니다.

부분 인덱스 기능

부분 인덱스 나열

작업을 partialFilterExpression 사용하여 부분 인덱스를 나열합니다. getIndex 예를 들어 에서 실행한 getIndex 작업은 키, 이름 및 PartialFilterExpression 필드와 함께 부분 인덱스를 나열합니다.

db.orders.getIndexes()

이 예제는 다음과 같은 출력을 반환합니다.

[ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "ecommerceApp.orders" }, { "v" : 4, "unique" : true, "key" : { "category" : 1, "" : 1, "CustomerId" : 1, "OrderId" : 1 }, "name" : "category_1_CustID_1_OrderId_1", "ns" : "ecommerceApp.orders", "partialFilterExpression" : { "$and" : [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ] } } ]

동일한 키:order 상의 여러 부분 필터 표현식

동일한 필드 조합 (키:order) 에 대해 서로 다른 부분 인덱스를 만들 수 있습니다. 이러한 인덱스는 다른 이름을 가져야 합니다.

db.orders.createIndex( {"OrderId":1}, { name:"firstPartialIndex", partialFilterExpression:{"OrderId":{"$exists": true}} } )
db.orders.createIndex( {"OrderId":1}, { name:"secondPartialIndex", partialFilterExpression:{"OrderId":{"$gt": 1000}} } )

getIndexes작업을 실행하여 컬렉션의 모든 인덱스를 나열합니다.

db.orders.getIndexes()

이 예제는 다음과 같은 출력을 반환합니다.

[ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "ecommerceApp.orders" }, { "v" : 4, "key" : { "OrderId" : 1 }, "name" : "firstPartialIndex", "ns" : "ecommerceApp.orders", "partialFilterExpression" : {"OrderId":{"$exists": true}} }, { "v" : 4, "key" : { "OrderId" : 1 }, "name" : "secondPartialIndex", "ns" : "ecommerceApp.orders", "partialFilterExpression" : {"OrderId":{"$gt": 1000}} } ]
중요

인덱스 이름은 달라야 하며 이름으로만 삭제해야 합니다.

부분 및 TTL 속성이 있는 인덱스

인덱스 생성 중에 및 expireAfterSeconds 옵션을 모두 partialFilterExpression 지정하여 부분 및 TTL 속성을 포함하는 인덱스를 만들 수도 있습니다. 이렇게 하면 컬렉션에서 현재 제거되는 문서를 더 잘 제어할 수 있습니다.

예를 들어, 특정 기간 이후에 삭제될 문서를 식별하는 TTL 색인이 있을 수 있습니다. 이제 부분 색인 옵션을 사용하여 문서를 삭제할 시기에 대한 추가 조건을 제공할 수 있습니다.

db.orders.createIndex( { "OrderTimestamp": 1 }, { expireAfterSeconds: 3600 , partialFilterExpression: { "isDelivered": { $eq: true } } } )

이 예제는 다음과 같은 출력을 반환합니다.

{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1, "operationTime" : Timestamp(1234567890, 1) }

getIndexes작업을 실행하여 컬렉션에 있는 인덱스를 나열합니다.

db.orders.getIndexes() [ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.orders" }

이 예제는 다음과 같은 출력을 반환합니다.

[ { "v": 4, "key": { "_id": 1 }, "name": "_id_", "ns": "ecommerceApp.orders" }, { "v": 4, "key": { "OrderTimestamp": 1 }, "name": "OrderTimestamp_1", "ns": "ecommerceApp.orders", "partialFilterExpression": { "isDelivered": { "$eq": true } }, "expireAfterSeconds": 3600 } ]

부분 인덱스 제한

부분 인덱스 기능에는 다음과 같은 제한이 적용됩니다.

  • Amazon DocumentDB의 불평등 쿼리는 쿼리 필터 조건자가 데이터 유형과 정확히 partialFilterExpression 일치하고 동일한 데이터 유형인 경우에만 부분 인덱스를 사용합니다.

    참고

    위의 경우에는 IXSCAN을 강제 실행하는 데에도 사용할 수 $hint 없습니다.

    다음 예제에서는 에만 적용되며 field1 적용되지는 않습니다field2. partialFilterExpression

    db.orders.createIndex( {"OrderAmount": 1}, {"partialFilterExpression": { OrderAmount : {"$gt" : 5}}} ) db.orders.find({OrderAmount : {"$gt" : 5}}) // Will use partial index db.orders.find({OrderAmount : {"$gt" : 6}}) // Will not use partial index db.orders.find({OrderAmount : {"$gt" : Decimal128(5.00)}}) // Will not use partial index
  • 배열 연산자가 partialFilterExpression 있는 A는 지원되지 않습니다. 다음 작업을 수행하면 오류가 발생합니다.

    db.orders.createIndex( {"CustomerId":1}, {'partialFilterExpression': {'OrderId': {'$eq': [1000, 1001, 1002]}}} )
  • 다음 연산자는 partialFilterExpression 필드에서 지원되지 않습니다.

    • $all(배열 연산자)

    • $mod(배열 연산자)

    • $or

    • $xor

    • $not

    • $nor

  • 필터 표현식과 필터의 데이터 유형은 같아야 합니다.