DynamoDB에는 기본키에 추가로 두 종류의 인덱스가 있다
글로벌 보조 인덱스(GSI)
로컬 보조 인덱스(LSI)
기본키는 파티션키와 추가로 정렬키를 가질 수 있다.
AWS에서 DynamoDB는 물리적으로 여러 파티션에 데이터를 나눠서 저장한다.
저장될 파티션의 위치를 정하는게 파티션키이며 파티션 내에선 정렬키로 정렬되어 저장된다.
카디널키의 중복도가 높을 경우 특정 물리적 파티션에 부하가 몰릴 수 있다.
카디널리티가 높은 경우여도 월별이나 일별로 키를 잡는 경우 해당 날짜의 모든 데이터가 하나의 파티션으로 들어가므로 좋지 않다.
파티션키는 HASH와 같이 동작하므로 BTREE처럼 범위검색이 되지 않는다.
(실제 자료구조는 모름)
파티션키로 페이징이나 범위검색을 해야 될 경우 인덱스가 필요하다
로컬 보조 인덱스는 파티션키는 같이 쓰고 정렬키만 다르게 설정한다.
LSI는 테이블과 동일한 파티션 내에 있기 때문에 테이블에서의 쓰기 작업을 일관성 있게 가져올 수 있다. (강력한읽기사용)
한 파티션에서 실행하기 때문에 최대 5개만 지원하는 듯 하다.
글로벌 보조 인덱스는 정렬키를 포함해 파티션키도 다르게 설정한다.
파티션키가 다르기 때문에 비동기적으로 실행되므로 강력한 읽기를 지원하지 않는듯 하다.
최대 20개 지원한다.
다른 RDB와 다르게 인덱스를 이용해서 테이블을 찾는데 사용되지 않는다.
인덱스를 만들 때 테이블에서 복사할 컬럼을 지정해서 인덱스에도 저장하며 인덱스 검색시 해당 값으로 조회한다.
같은 값을 갖는 테이블을 새로 만드는 개념과 비슷한 것 같다.
하나의 테이블을 사용함으로서 각각 테이블을 사용하는 것 보다 파티션 하나에 몰릴 확률을 줄일 수 있다.
데이터(pk, sk)
파티션키와 정렬키를 반대로 지정한 인덱스로 특정 상황에서 검색을 용이하게 한다.
여러 컬럼으로 정렬키를 못하므로 일반적으로 인덱스당 하나의 컬럼만 정렬할 수 있다.
한 컬럼에 주문자#주문금액#주문날짜 이런식으로 값을 넣으면 여러 값으로 정렬할 수 있다.
물리적인 파티션이 실제로 몇개로 나눠져있는지 확인해볼 수 없다.
사용량이나 데이터 크기에 따라 정해지는 것 같다.
사용이 몰리는 핫 파티션이 생길 경우 프로비저닝 모드에서 지정한 용량을 모두 효율적으로 사용하지 못한다. 온디맨드 환경에서는 자세한 내용은 못찾았지만 비슷할 것 같다