Amazon DynamoDB
개발자 안내서 (API 버전 2012-08-10)

DynamoDB의 보조 인덱스 사용에 대한 일반 지침

Amazon DynamoDB는 두 종류의 보조 인덱스를 지원합니다.

  • 글로벌 보조 인덱스 — 기본 테이블의 파티션 키 및 정렬 키와 다른 파티션 키와 정렬 키가 있는 인덱스입니다. 모든 파티션에서 인덱스의 쿼리가 기본 테이블의 모든 데이터에 적용될 수 있으므로 글로벌 보조 인덱스는 글로벌하게 간주됩니다. 글로벌 보조 인덱스에는 크기 제한이 없고, 테이블과 다른 읽기 및 쓰기 작업에 대한 프로비저닝된 처리량 설정 값을 가지고 있습니다.

  • 로컬 보조 인덱스 — 기본 테이블과 동일한 파티션 키가 있지만, 정렬 키가 다른 인덱스입니다. 로컬 보조 인덱스는 로컬 보조 인덱스의 모든 파티션이 동일한 파티션 키 값을 갖는 기본 테이블 파티션으로 한정된다는 의미에서 "로컬"이라고 합니다. 따라서 특정 파티션 키 값에 대해 인덱스된 항목의 총 크기가 10GB를 초과할 수 없습니다. 또한 로컬 보조 인덱스는 인덱싱한 테이블과 쓰기 및 읽기 작업에 대해 프로비저닝된 처리량 설정을 공유합니다.

DynamoDB의 각 테이블은 20개의 글로벌 보조 인덱스(기본 제한)와 5개의 로컬 보조 인덱스로 제한됩니다.

글로벌 보조 인덱스와 로컬 보조 인덱스의 차이에 대한 자세한 내용은 보조 인덱스를 사용하여 데이터 액세스 향상를 참조하십시오.

일반적으로 로컬 보조 인덱스보다 글로벌 보조 인덱스를 사용해야 합니다. 단 쿼리 결과에 높은 일관성이 필요한 경우는 예외입니다. 로컬 보조 인덱스는 높은 일관성을 제공할 수 있지만, 글로벌 보조 인덱스는 이것이 불가능합니다(글로벌 보조 인덱스 쿼리는 최종 일관성만 지원).

다음은 DynamoDB에 인덱스를 생성할 때 유의해야 할 몇 가지 일반 원칙과 설계 패턴입니다.

인덱스를 효율적으로 사용

인덱스의 수를 최소한으로 유지합니다. 자주 쿼리하지 않는 속성에서는 보조 인덱스를 생성하지 않습니다. 거의 사용하지 인덱스는 애플리케이션 성능 향상에 도움을 주지 못하며, 스토리지 및 IO 비용을 높입니다.

신중하게 프로젝션 선택

보조 인덱스는 스토리지 및 프로비저닝된 처리량을 이용하므로 인덱스를 가능한 한 작은 크기로 유지해야 합니다. 또한 인덱스 크기가 작을수록 전체 테이블에서 쿼리하는 데 비해 성능면에서 훨씬 큰 이점이 있습니다. 일반적으로 쿼리에서 속성의 작은 하위 집합만 반환하고 해당 속성의 총 크기가 전체 항목보다 훨씬 작은 경우, 정기적으로 요청할 속성만 프로젝션하십시오.

테이블에서 쓰기 작업이 읽기에 비해 많을 것으로 예상되는 경우, 다음 모범 사례를 적용합니다.

  • 적은 수의 속성을 프로젝션하여 인덱스에 쓸 항목 크기를 최소화하도록 고려하십시오. 그러나 프로젝션된 속성의 크기가 단일 쓰기 용량 유닛(1 KB)보다 큰 경우에만 적용됩니다. 예를 들어 인덱스 항목 크기가 200바이트인 경우, DynamoDB가 항목 크기를 1 KB로 반올림합니다. 즉, 인덱스 항목이 작으면 추가 비용 없이 더 많은 속성을 프로젝션할 수 있습니다.

  • 쿼리에 거의 필요하지 않은 프로젝센된 속성을 피합니다. 인덱스에 프로젝션된 속성을 업데이트할 때마다 인덱스 업데이트에 추가 비용이 발생합니다. Query에서 프로젝션하지 않은 속성을 검색하는 경우 프로비저닝된 처리량 비용이 증가하지만, 쿼리 비용이 자주 인덱스를 업데이트하는 비용보다 훨씬 더 낮습니다.

  • 쿼리에서 전체 테이블 항목을 반환하지만 다른 정렬 키로 테이블을 정렬하는 경우에만 ALL을 지정하십시오. 모든 속성을 프로젝션하면 테이블 페치가 필요 없지만, 저장과 쓰기 작업 비용이 두 배 증가합니다.

다음 섹션에서 설명하겠지만, 페치를 최소한으로 유지하는 동시에 인덱스를 가능한 작게 유지해야 합니다.

페치 방지를 위한 잦은 쿼리의 최적화

가장 적은 지연 시간으로 가장 빠른 쿼리를 가져오려면 해당 쿼리가 반환할 것으로 예상되는 모든 속성을 프로젝션하십시오. 특히 프로젝션되지 않은 속성에 대해 로컬 보조 인덱스를 쿼리하면, DynamoDB가 자동으로 테이블에서 이런 속성을 가져오는데, 이 경우 테이블에서 전체 항목을 읽어야 합니다. 이렇게 하면 지연 시간과 추가적인 I/O 작업 발생을 피할 수 없습니다.

종종 '간헐적' 쿼리가 '필수' 쿼리로 변한다는 점을 유의합시오. 간헐적으로만 쿼리할 것으로 예상하기 때문에 프로젝션을 하지 않는 속성이 있다면, 상황이 바뀔지 여부, 속성을 프로젝션하지 않은 것을 후회하게 될지 여부를 고려해야 합니다.

테이블 가져오기에 대한 자세한 내용은 로컬 보조 인덱스에서 프로비저닝된 처리량 고려 사항 단원을 참조하십시오.

로컬 보조 인덱스를 생성할 때 항목 모음의 크기 제한을 유의

항목 모음은 파티션 키가 동일한 테이블과 로컬 보조 인덱스의 모든 항목입니다. 항목 모음은 10GB를 초과할 수 없으므로 특정 파티션 키 값에 대한 공간이 부족할 수 있습니다.

테이블 항목을 추가하거나 업데이트하는 경우 DynamoDB는 영향을 받는 모든 로컬 보조 인덱스도 업데이트합니다. 인덱싱된 속성이 테이블에 정의되면 로컬 보조 인덱스 또한 늘어납니다.

로컬 보조 인덱스를 생성할 때, 여기에 기록할 데이터의 양과 동일한 파티션 키 값을 갖게 될 데이터 항목의 수를 고려하십시오. 특정 파티션 키 값에 대한 테이블과 인덱스 항목의 합이 10GB를 초과할 것으로 예상되면 인덱스를 생성하지 않아야 하는지를 고려하십시오.

로컬 보조 인덱스를 반드시 생성해야 한다면 항목 모음 크기 제한을 예상하여 초과되기 전에 조치를 취해야 합니다. 제한값 내에서 작업 및 교정 작업에 대한 전략은 항목 컬렉션 크기 제한의 내용을 참조하십시오.