DynamoDB의 보조 인덱스 사용에 대한 일반 지침
Amazon DynamoDB는 두 종류의 보조 인덱스를 지원합니다.
-
글로벌 보조 인덱스(GSI) - 기본 테이블의 파티션 키 및 정렬 키와 다른 파티션 키와 정렬 키가 있는 인덱스입니다. 모든 파티션에서 인덱스의 쿼리가 기본 테이블의 모든 데이터에 적용될 수 있으므로 글로벌 보조 인덱스는 글로벌하게 간주됩니다. 글로벌 보조 인덱스에는 크기 제한이 없고, 테이블과 다른 읽기 및 쓰기 작업에 대한 프로비저닝된 처리량 설정 값을 가지고 있습니다.
-
로컬 보조 인덱스(LSI) - 기본 테이블과 동일한 파티션 키가 있지만, 정렬 키가 다른 인덱스입니다. 로컬 보조 인덱스는 로컬 보조 인덱스의 모든 파티션이 동일한 파티션 키 값을 갖는 기본 테이블 파티션으로 한정된다는 의미에서 "로컬"이라고 합니다. 따라서 특정 파티션 키 값에 대해 인덱스된 항목의 총 크기가 10GB를 초과할 수 없습니다. 또한 로컬 보조 인덱스는 인덱싱한 테이블과 쓰기 및 읽기 작업에 대해 프로비저닝된 처리량 설정을 공유합니다.
DynamoDB의 각 테이블은 최대 20개의 글로벌 보조 인덱스(기본 할당량)와 5개의 로컬 보조 인덱스를 가질 수 있습니다.
글로벌 보조 인덱스는 로컬 보조 인덱스보다 더 유용한 경우가 많습니다. 사용할 인덱스 유형을 결정하는 것도 애플리케이션의 요구 사항에 따라 달라집니다. 글로벌 보조 인덱스와 로컬 보조 인덱스의 비교 및 선택 방법에 대한 자세한 내용은 DynamoDB에서 보조 인덱스를 사용하여 데이터 액세스 개선 섹션을 참조하세요.
다음은 DynamoDB에 인덱스를 생성할 때 유의해야 할 몇 가지 일반 원칙과 설계 패턴입니다.
효율적으로 인덱스 사용
인덱스의 수를 최소한으로 유지합니다. 자주 쿼리하지 않는 속성에서는 보조 인덱스를 생성하지 않습니다. 거의 사용하지 않는 인덱스는 애플리케이션 성능 향상에 도움을 주지 못하며, 스토리지 및 I/O 비용을 높입니다.
신중하게 프로젝션 선택
보조 인덱스는 스토리지 및 프로비저닝된 처리량을 이용하므로 인덱스를 가능한 한 작은 크기로 유지해야 합니다. 또한 인덱스 크기가 작을수록 전체 테이블에서 쿼리하는 데 비해 성능면에서 훨씬 큰 이점이 있습니다. 일반적으로 쿼리에서 속성의 작은 하위 집합만 반환하고 해당 속성의 총 크기가 전체 항목보다 훨씬 작은 경우, 정기적으로 요청할 속성만 프로젝션하세요.
테이블에서 쓰기 작업이 읽기에 비해 많을 것으로 예상되는 경우, 다음 모범 사례를 적용합니다.
-
적은 수의 속성을 프로젝션하여 인덱스에 쓸 항목 크기를 최소화하도록 고려하세요. 그러나 프로젝션된 속성의 크기가 단일 쓰기 용량 유닛(1KB)보다 큰 경우에만 적용됩니다. 예를 들어 인덱스 항목 크기가 200바이트인 경우, DynamoDB가 항목 크기를 1KB로 반올림합니다. 즉, 인덱스 항목이 작으면 추가 비용 없이 더 많은 속성을 프로젝션할 수 있습니다.
-
쿼리에 거의 필요하지 않은 프로젝센된 속성을 피합니다. 인덱스에 프로젝션된 속성을 업데이트할 때마다 인덱스 업데이트에 추가 비용이 발생합니다.
Query
에서 프로젝션하지 않은 속성을 검색하는 경우 프로비저닝된 처리량 비용이 증가하지만, 쿼리 비용이 자주 인덱스를 업데이트하는 비용보다 훨씬 더 낮습니다. -
쿼리에서 전체 테이블 항목을 반환하지만 다른 정렬 키로 테이블을 정렬하는 경우에만
ALL
을 지정하세요. 모든 속성을 프로젝션하면 테이블 페치가 필요 없지만, 저장과 쓰기 작업 비용이 두 배 증가합니다.
다음 섹션에서 설명하겠지만, 페치를 최소한으로 유지하는 동시에 인덱스를 가능한 작게 유지해야 합니다.
빈번한 쿼리를 최적화하여 페치 방지
가장 적은 지연 시간으로 가장 빠른 쿼리를 가져오려면 해당 쿼리가 반환할 것으로 예상되는 모든 속성을 프로젝션하세요. 특히 프로젝션되지 않은 속성에 대해 로컬 보조 인덱스를 쿼리하면, DynamoDB가 자동으로 테이블에서 이런 속성을 가져오는데, 이 경우 테이블에서 전체 항목을 읽어야 합니다. 이렇게 하면 지연 시간과 추가적인 I/O 작업 발생을 피할 수 없습니다.
종종 '간헐적' 쿼리가 '필수' 쿼리로 변한다는 점을 유의합시오. 간헐적으로만 쿼리할 것으로 예상하기 때문에 프로젝션을 하지 않는 속성이 있다면, 상황이 바뀔지 여부, 속성을 프로젝션하지 않은 것을 후회하게 될지 여부를 고려해야 합니다.
테이블 가져오기에 대한 자세한 내용은 로컬 보조 인덱스에 대해 프로비저닝된 처리량 고려 사항 단원을 참조하세요.
로컬 보조 인덱스를 생성할 때 항목 모음의 크기 제한 유의
항목 모음은 파티션 키가 동일한 테이블과 로컬 보조 인덱스의 모든 항목입니다. 항목 모음은 10GB를 초과할 수 없으므로 특정 파티션 키 값에 대한 공간이 부족할 수 있습니다.
테이블 항목을 추가하거나 업데이트하는 경우 DynamoDB는 영향을 받는 모든 로컬 보조 인덱스도 업데이트합니다. 인덱싱된 속성이 테이블에 정의되면 로컬 보조 인덱스 또한 늘어납니다.
로컬 보조 인덱스를 생성할 때, 여기에 기록할 데이터의 양과 동일한 파티션 키 값을 갖게 될 데이터 항목의 수를 고려하세요. 특정 파티션 키 값에 대한 테이블과 인덱스 항목의 합이 10GB를 초과할 것으로 예상되면 인덱스를 생성하지 않아야 하는지를 고려하세요.
로컬 보조 인덱스를 반드시 생성해야 한다면 항목 모음 크기 제한을 예상하여 초과되기 전에 조치를 취해야 합니다. 가장 좋은 방법은 항목을 작성할 때 ReturnItemCollectionMetrics
파라미터를 활용하여 10GB 크기 한도에 근접하는 항목 모음 크기를 모니터링하고 이에 대해 경고하는 것입니다. 최대 항목 모음 크기를 초과하면 쓰기 시도가 실패합니다. 애플리케이션에 영향을 미치기 전에 항목 모음 크기를 모니터링하고 경고하여 항목 모음 크기 문제를 완화할 수 있습니다.
참고
로컬 보조 인덱스를 생성한 후에는 삭제할 수 없습니다.
제한값 내에서 작업 및 교정 작업에 대한 전략은 항목 컬렉션 크기 제한의 내용을 참조하세요.