

# 희소 인덱스 활용
<a name="bp-indexes-general-sparse-indexes"></a>

테이블의 모든 항목에 대해 DynamoDB는 **인덱스 키 속성이 항목에 있는 경우에만** 해당 인덱스 항목을 기록합니다. 글로벌 보조 인덱스의 경우 항목에 인덱스 파티션 키를 정의해야 하며, 인덱스에 정렬 키도 있는 경우 해당 속성도 있어야 합니다. 키 속성 중 하나가 항목에서 누락된 경우 해당 항목이 인덱스에 표시되지 않습니다. 기본 테이블의 항목 하위 집합만 나타나는 인덱스를 *희소* 인덱스라고 합니다.

희소한 인덱스는 테이블의 작은 하위 항목에 대한 쿼리에 유용합니다. 예를 들어, 다음의 키 속성을 가지고 있는 고객 주문을 모두 저장한 테이블이 있다고 가정하겠습니다.
+ 파티션 키: `CustomerId`
+ Sort key: `OrderId`

열려 있는 주문을 추적할 경우, 아직 발송하지 않은 주문 항목에 `isOpen`이라는 속성을 삽입할 수 있습니다. 그리고 주문을 발송한 후에 이 속성을 삭제할 수 있습니다. 그리고 `CustomerId`(파티션 키) 및 `isOpen`(정렬 키)에 인덱스를 생성하면, `isOpen` 이 정의된 주문만 여기에 표시됩니다. 수천 가지의 주문이 있지만 열려 있는 주문이 적은 경우, 전체 테이블을 스캔하는 대신 열려 있는 주문의 인덱스에 쿼리를 하는 것이 훨씬 빠르고 경제적입니다.

`isOpen` 같은 속성 유형을 사용하는 대신, 인덱스에서 유용하게 주문을 분류하는 값을 가진 속성을 사용할 수도 있습니다. 예를 들어, 각 주문 날짜에 대한 `OrderOpenDate` 속성을 사용한 후, 주문을 처리한 후에 이를 삭제할 수도 있습니다. 이는 희소 인덱스를 쿼리할 때, 주문한 날짜를 기준으로 항목을 분류해 반환하는 방식입니다.

## DynamoDB의 희소 인덱스 예
<a name="bp-indexes-sparse-examples"></a>

글로벌 보조 인덱스는 기본값이 '희소'입니다. 글로벌 보조 인덱스를 생성할 때는 파티션 키를 지정해야 합니다(선택적으로 정렬 키 지정). 필수 키 속성을 가진 기본 테이블의 항목만 인덱스에 표시됩니다. 항목에 인덱스 파티션 키 또는 정렬 키가 없는 경우 항목이 정의되면 해당 항목은 인덱스에서 제외됩니다.

글로벌 보조 인덱스를 희소 인덱스로 설계해서 프로비저닝을 하면, 기본 테이블보다 쓰기 처리량을 줄이고, 성능을 높일 수 있습니다.

예를 들어, 게임 애플리케이션이 모든 사용자의 점수를 추적하지만, 점수가 높은 소수만 쿼리할 필요가 있다고 가정하겠습니다. 다음 설계가 이런 시나리오를 효율적으로 처리합니다.

![\[희소 GSI 예\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/SparseIndex_A.png)


Rick이 3가지 게임을 플레이했는 데, 이 중 하나에서 `Champ` 상태를 달성했다고 가정하겠습니다. Padama는 4가지 게임을 플레이했는 데, 이 중 2개에서 `Champ` 상태를 달성했습니다. `Award` 속성은 사용자가 성과(Award)를 달성한 항목에만 표시됩니다. 이과 관련된 글로벌 보조 인덱스는 다음과 같습니다.

![\[희소 GSI 예\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/SparseIndex_B.png)


글로벌 보조 인덱스에는 기본 테이블의 항목 중 소수 하위 집합으로 자주 쿼리되는 높은 점수만 포함되어 있습니다.