본문으로 건너뛰기

Index

1 DynamoDB Indexes

  • Amazon DynamoDB는 강력한 NoSQL 데이터베이스 서비스입니다.
  • 데이터 액세스 패턴을 최적화하기 위해 DynamoDB는 두 가지 유형의 인덱스를 제공합니다:
    • Local Secondary Index (LSI)
    • Global Secondary Index (GSI)
  • 이러한 인덱스들은 쿼리 성능을 향상시키고 데이터 액세스의 유연성을 제공합니다.

2 Local Secondary Index (LSI)

  • LSI(Local Secondary Index)는 DynamoDB 테이블의 쿼리 기능을 확장하는 강력한 도구입니다.
  • 기본 개념을 이해하기 위해, 먼저 DynamoDB 테이블의 기본 구조를 살펴보겠습니다.

2.1 DynamoDB 테이블의 기본 구조

  • DynamoDB 테이블은 기본적으로 두 가지 키를 가집니다
    • 파티션 키(Partition Key): 데이터를 여러 파티션에 분산시키는 역할
    • 정렬 키(Sort Key): 각 파티션 내에서 데이터를 정렬하는 역할

2.2 LSI의 역할

  • LSI는 기존 테이블 구조를 유지하면서 추가적인 정렬 옵션을 제공합니다.
  • 주요 특징
    • 파티션 키는 기본 테이블과 동일하게 유지
    • 정렬 키를 다른 속성으로 대체

2.3 LSI 사용 예시

  • 다음 예시를 통해 LSI의 사용법을 이해해 봅시다:

온라인 쇼핑몰 주문 테이블

  • 기본 테이블 구조
    • 파티션 키: CustomerId
    • 정렬 키: OrderId
  • 기본 테이블 쿼리
    • "고객 ID가 12345인 모든 주문을 OrderId 순으로 조회"
  • LSI 추가 (정렬 키: OrderDate)
    • 파티션 키: CustomerId (기본 테이블과 동일)
    • 정렬 키: OrderDate
  • LSI 사용 쿼리:
    • "고객 ID가 12345인 모든 주문을 주문 날짜 순으로 조회"

2.4 LSI의 이점

  • 다양한 쿼리 패턴 지원:
    • 동일한 데이터에 대해 여러 가지 방식으로 정렬된 뷰를 제공
  • 쿼리 성능 향상:
    • 특정 속성에 대한 빠른 검색이 가능
  • 데이터 일관성:
    • 기본 테이블과 강력한 일관성을 유지

2.5 LSI 사용 시 주의사항

  • 테이블 생성 시에만 정의 가능: 나중에 추가하거나 삭제할 수 없음
  • 인덱스 수 제한: 테이블당 최대 5개의 LSI만 생성 가능
  • 추가 스토리지 사용: 인덱스도 데이터를 저장하므로 스토리지 비용 증가

3 Global Secondary Index (GSI)

  • GSI는 DynamoDB에서 제공하는 강력한 기능으로, 테이블 데이터에 대한 다양한 접근 방식을 제공합니다.
  • 기본 테이블과는 완전히 독립적인 새로운 뷰를 생성할 수 있습니다.

3.1 GSI의 기본 개념

  • GSI는 기본 테이블의 데이터를 다른 키 구조로 재구성한 별도의 인덱스입니다.
  • 주요 특징:
    • 새로운 파티션 키와 정렬 키(선택사항) 정의 가능
    • 기본 테이블의 어떤 속성이라도 키로 사용 가능
    • 기본 테이블과 다른 키 구조 사용 가능

3.2 GSI vs LSI 비교

  • LSI: 같은 파티션 키, 다른 정렬 키
  • GSI: 완전히 새로운 파티션 키와 정렬 키 (둘 다 선택 가능)

3.3 GSI 사용 예시

  • 음악 스트리밍 서비스의 'Songs' 테이블을 예로 들어보겠습니다:
  • 기본 테이블 구조:
    • 파티션 키: ArtistId
    • 정렬 키: SongId
  • GSI 1: 장르별 인기 노래
    • 파티션 키: Genre
    • 정렬 키: Popularity
  • GSI 2: 발매일별 노래
    • 파티션 키: ReleaseYear
    • 정렬 키: ReleaseDate
  • 가능한 쿼리:
    • "특정 장르의 가장 인기 있는 노래 조회" (GSI 1 사용)
    • "특정 연도에 발매된 노래를 날짜순으로 조회" (GSI 2 사용)

3.4 GSI의 장점

  1. 유연한 쿼리: 기본 테이블 구조와 무관한 다양한 쿼리 패턴 지원
  2. 동적 생성: 테이블 생성 후에도 GSI 추가/수정 가능
  3. 성능 최적화: 특정 쿼리 패턴에 대해 최적화된 성능 제공
  4. 데이터 일관성: 기본 테이블 업데이트 시 GSI도 자동 업데이트 (단, 약간의 지연 있음)

3.5 GSI 사용 시 고려사항

  1. 별도의 용량 관리: GSI에 대해 별도의 읽기/쓰기 용량 단위(RCU/WCU) 설정 필요
  2. 추가 비용: 각 GSI는 추가 스토리지와 처리 용량을 사용하므로 비용 증가
  3. 최종 일관성: GSI는 기본 테이블과 최종 일관성만 제공 (즉시 반영되지 않을 수 있음)
  4. 프로젝션 선택: GSI에 포함할 속성을 신중히 선택하여 성능과 비용 최적화 필요

3.6 GSI 생성 예시 (AWS CLI)

 aws dynamodb update-table \
--table-name Songs \
--attribute-definitions AttributeName=Genre,AttributeType=S AttributeName=Popularity,AttributeType=N \
--global-secondary-index-updates \
"[{\"Create\":{\"IndexName\": \"GenrePopularityIndex\",\"KeySchema\":[{\"AttributeName\":\"Genre\",\"KeyType\":\"HASH\"},{\"AttributeName\":\"Popularity\",\"KeyType\":\"RANGE\"}],\"Projection\":{\"ProjectionType\":\"ALL\"}}}]"

4 인덱스와 스로틀링

  • DynamoDB의 인덱스 사용 시 스로틀링에 대한 고려가 필요합니다.
  • 스로틀링은 프로비저닝된 처리량을 초과할 때 발생하는 요청 제한을 의미합니다.

4.1 GSI의 스로틀링 특성

  • GSI에 대한 쓰기가 스로틀되면 기본 테이블도 스로틀됩니다.
  • 이는 기본 테이블의 WCU가 충분하더라도 발생할 수 있습니다.
  • GSI의 파티션 키 선택과 WCU 할당에 주의가 필요합니다.

4.2 LSI의 스로틀링 특성

  • LSI는 기본 테이블의 WCU와 RCU를 사용합니다.
  • 따라서 LSI에 대한 특별한 스로틀링 고려사항이 없습니다.

5 결론

  • DynamoDB의 LSI와 GSI는 데이터 액세스 패턴을 최적화하는 강력한 도구입니다.
  • LSI는 같은 파티션 키 내에서 추가적인 정렬 기능을 제공합니다.
  • GSI는 완전히 새로운 액세스 패턴을 가능하게 합니다.
  • 인덱스 사용 시 성능과 비용 사이의 균형을 고려해야 합니다.
  • 특히 GSI 사용 시 스로틀링에 주의해야 하며, 적절한 용량 계획이 필요합니다.