DynamoDB의 GSI 대 LSI
글로벌 보조 인덱스(GSI)와 로컬 보조 인덱스(LSI) 둘 다 테이블의 키가 아닌
속성으로 Query할 수 있게 해 줍니다. 이 둘은 서로 대체할 수 없습니다 — 그
차이가 어떤 패턴에 어느 것이 필요한지를 결정합니다.
DynamoDB에서 GSI와 LSI의 차이는 무엇인가요?
글로벌 보조 인덱스는 어떤 최상위 스칼라 속성(String, Number, Binary)이든 파티션 키로 쓸 수 있고, 자체 용량을 가지며, 언제든 추가할 수 있습니다 — 다만 최종적 일관성 읽기만 제공합니다. 로컬 보조 인덱스는 테이블의 같은 파티션 키를 다른 정렬 키와 함께 유지하고, 강력한 일관성 읽기를 지원하며 테이블의 용량을 공유하지만, 테이블과 함께 생성해야 합니다.
중요한 차이들
| GSI | LSI | |
|---|---|---|
| 파티션 키 | 어떤 스칼라든 (S/N/B) | 테이블과 같음 |
| 정렬 키 | 어떤 스칼라든 (S/N/B) | 어떤 스칼라든 (S/N/B) |
| 생성 시점 | 언제든 | 테이블 생성 시에만 |
| 일관성 | 최종적 일관성만 | 강력한 일관성 가능 |
| 용량 | 자체 용량 | 테이블의 용량을 공유 |
| 쓰기 전파 | 비동기(최종적) | 동기(원자적) |
| 테이블당 최대 | 20(기본값, 상향 가능) | 5(고정) |
| 10 GB 파티션 상한 | 없음 | 있음(PK당) |
어림 규칙
- 다른 가 필요한가요(예: 주문을
customer가 아니라status로 조회)? GSI가 필요합니다 — LSI는 재파티션할 수 없습니다. - 같은 파티션 안에서 두 번째 정렬 순서가 필요한가요 — LSI는 테이블의 정확한 파티션 키를 유지하고 오직 다른 정렬 키만 바꿔 넣습니다 — 처음부터 정하고, 읽기와 함께? LSI가 맞습니다.
선택은 하나의 질문으로 압축됩니다 — 어떤 키를 바꾸고 있나요:
다른 파티션 키는 GSI를 강제하고, 같은 파티션의 다른 정렬 키가 LSI가 맞는 유일한 경우입니다.
실제로 대부분의 팀은 거의 전적으로 GSI를 꺼내 듭니다: 나중에 추가할 수 있고, 독립적으로 스케일되며, 10 GB 파티션당 한도의 대상이 아니기 때문입니다. 하나의 GSI 키를 오버로드해 여러 패턴을 처리하세요 — 싱글 테이블 디자인을 보세요.
Scan을 없애려고 GSI를 추가한다면, 그것이 자체 읽기/쓰기 용량을 가진다는 점을 기억하세요. 그 추가 비용을 요금 계산기로 산정하고, DynoTable을 사용해 인덱스에 커밋하기 전에 그것의 프로젝션된 속성을 살펴보세요.