Python(boto3)에서 DynamoDB GSI 쿼리하기

글로벌 보조 인덱스 쿼리는 일반 query에 매개변수 하나(IndexName)를 더한 것입니다. 그러면 키 조건은 테이블이 아닌 인덱스의 키를 대상으로 합니다 — 여기서 AlbumTitle-index는 앨범별로 노래를 가져오게 해주는데, 이는 기본 테이블(Artist + SongTitle)이 스캔 없이는 처리할 수 없는 접근 패턴입니다.

Code

import boto3

client = boto3.client("dynamodb")

paginator = client.get_paginator("query")

items = []
for page in paginator.paginate(
    TableName="Music",
    IndexName="AlbumTitle-index",
    KeyConditionExpression="#hashKey = :hashKeyValue",
    ExpressionAttributeNames={"#hashKey": "AlbumTitle"},
    ExpressionAttributeValues={":hashKeyValue": {"S": "Danzon"}},
):
    items.extend(page["Items"])

print(f"Found {len(items)} songs on the album")

Explanation

  • IndexName — 쿼리할 GSI를 지정합니다(TableName은 여전히 필수). KeyConditionExpression인덱스의 파티션(그리고 선택적 정렬) 키 — 여기서는 AlbumTitle — 를 테이블 쿼리와 동일한 연산자로 사용합니다.
  • 최종적 일관성만 지원 — GSI는 기본 테이블에서 비동기적으로 복제됩니다. GSI 쿼리에서 ConsistentRead=True를 전달해도 승격되지 않으며 ValidationException이 발생합니다. (로컬 보조 인덱스는 강력한 일관성을 지원합니다.)
  • 투영된 속성만 반환 — GSI 쿼리는 인덱스가 투영한 것(ALL, KEYS_ONLY, 또는 INCLUDE로 나열된 속성)을 반환하며, 나머지를 기본 테이블에서 가져올 수 없습니다. 투영되지 않은 속성이 필요한가요? 테이블 키에 대해 get_item으로 후속 조회하거나 투영을 넓히세요.
  • GSI에서는 키가 고유하지 않음 — 여러 항목이 동일한 인덱스 키를 공유할 수 있으며, 인덱스 키 속성이 없는 항목은 단순히 나타나지 않습니다(이것이 희소 인덱스 패턴입니다).
  • 페이지네이션client.get_paginator("query")는 테이블 쿼리와 똑같이 페이지에 걸쳐 LastEvaluatedKey를 따라가며, 각 pageItems 리스트를 담습니다.
  • 리소스 API에서는 동일한 쿼리가 네이티브 Python 값을 사용하는 table.query(IndexName="AlbumTitle-index", KeyConditionExpression=Key("AlbumTitle").eq("Danzon"))입니다.

Do it visually

DynamoDB Expression Builder는 인덱스 쿼리를 위한 키 조건 + 이름/값 맵을 만들고 실행 가능한 boto3 코드를 복사해 줍니다.

테이블의 인덱스를 탐색하고 폼에서 GSI 쿼리를 실행하려면 — 페이지네이션 그리드, 코드로 복사 — DynoTable을 다운로드하세요.

References

Last verified 2026-07-13 against the official AWS documentation linked above.

이 요청을 시각적으로 만들기

무료 DynamoDB 쿼리 빌더에서 이 작업을 구성하세요 — 키 조건, 필터, 인덱스, Limit, 정렬 순서, 페이지네이션 루프 — 그리고 실행 가능한 SDK v3, CLI, boto3 프로그램으로 다시 복사하세요.

DynamoDB 쿼리 빌더 열기

Console 없이 DynamoDB 작업하기

DynoTable은 DynamoDB를 위한 빠른 데스크톱 클라이언트입니다 — 테이블을 탐색하고, SQL 스타일 쿼리를 실행하고, 항목을 로컬에서 편집하세요.