희소 인덱스 활용 - Amazon DynamoDB

희소 인덱스 활용

테이블의 모든 항목에 대해 DynamoDB는 인덱스 정렬 키 값이 항목에 있는 경우에만 해당 인덱스 항목을 기록합니다. 정렬 키가 모든 테이블 항목에 표시되지 않거나 인덱스 파티션 키가 항목에 없는 경우 인덱스가 희소하다고 말합니다.

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

  • 파티션 키: CustomerId

  • Sort key: OrderId

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

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

DynamoDB의 희소 인덱스 예

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

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

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

희소 GSI 예

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

희소 GSI 예

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