dynamoDB은 NoSQL이라서 SQL 쿼리처럼 컬럼명을 이용해 빠르게 원하는 데이터를 찾을 수 없다.

하지만 indexing을 사용해서 쿼리를 사용할 수 있도록 한다.

1. Hash, Range

dynamoDB는 테이블을 만들 때 Hash key, Range key를 설정할 수 있다. 내부적으로 이 두 개를 이용해 indexing을 한다.

{
    key1 : val
    key2 : val
    key3 : val
    key4 : val
}

위와 같은 스키마가 있을 때 Hash : key1, Range : key2 로 설정할 수 있다.

Range key는 optional이다.

이렇게 설정하면 이제 key1 * key2 로 인덱싱을 하게된다.

Hash*Range는 고유해야한다.

2. Scan, Query

기존 SQL처럼 WHERE key1=A AND key2=B 식으로 데이터를 찾고싶다고 할 때

dynamoDB에서 제공하는 Scan, Query를 사용할 수 있다.

  • Scan
    Filter Expression을 입력해서 원하는 데이터를 찾아올 수 있다.
    원하는 데이터들만 리턴되기 때문에 네트워크상에서 전달되는 패킷은 적어보이나
    DB 내부적으로 봤을 땐 전체를 갖고 온 뒤 key, value를 하나하나 비교해서
    맞지 않는 데이터를 삭제하는 방식이라 그만큼의 비용이 발생하게 된다. 
    문서 : https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/bp-query-scan.html

  • Query
    Hash, Range key로 설정한 애들로 indexing 처리가 되어있기 때문에 전체 데이터를 살펴보지않고도
    두 key를 이용해서 데이터를 찾을 수 있다.
    Range key는 이름답게 ==이 아닌 대교비교도 가능하다.
    (내부적으로 Hash + Btree 로 indexing을 하고있을 것 같다)

3. GSI, LSI

테이블을 위와같이 만들면 WHERE key1=A AND key2=B 같은 쿼리는 가능하겠지만 WHERE key3=A 같은 쿼리는 불가능하다. 그럼 또 맨땅에 헤딩식인 Scan을 써야하는데 그게 싫다면 Secondary Index을 쓰면 된다. 종류는 두 가지가 있다.

  • Local Secondary Index
    기본 Hash Key에 *Range Key 조합을 더 두는 방식이다. 테이블을 생성할 때만 세팅이 가능하기 때문에 처음부터 잘 설계해야한다. 나중에 LSI를 추가하고싶어지면 기존 테이블을 삭제하면서 마이그레이션 하는 방법 밖에 없다. 

    key1 * key2 이외에도
    key1 * key3 혹은 key1 * key4 로 인덱싱을 하나 더 하겠다는 뜻이다.
    테이블 자체의 기본 Hash Key(key1)에 공생하는 range key를 하나 더 파서 인덱싱한다 해서 Local이라는 이름이 붙은것 같다.
    보조 인덱스를 추가할때
    (테이블 Hash key== 보조인덱스 Hash key) && Range key 선택
    이여야만 LSI로 만들기 checkbox가 활성화 된다.

  • Global Secondary Index
    테이블 자체의 기본 Hash Key에 공생하지 않고 새로운 Hash Key (+Range Key)를 둬서 인덱싱을 하겠다는 뜻이다. GSI는 테이블 생성 후에도 설정가능하고 추후 변경, 삭제가 가능하다.
    key3 
    key3*key4
    key4*key3
    위처럼 인덱싱이 가능하다. LSI에서처럼 key1*key2를 해도 상관없다. 어차피 새로운 Hash Key를 둬서 인덱싱하는 것이기 때문에 같던 말던 dynamoDB는 상관 안한다.

    어? Hash key이름이 key1인데 LSI로 하고 싶으면 체크해라 아니면 그냥 GSI로 한다 ~~ 라고 체크박스를 표시해준다.

    GSI를 추가하고 난 뒤 해당 key를 이용해 쿼리를 날릴 수 있게 되었다.

Secondary Index 의 Hash*Range는 고유할 필요 없다.
기본 테이블의 Hash*Range만 고유하면 된다.

 

 

4. 복합 정렬키

Secondary Index의 경우 데이터의 Write, Update시 인덱싱 작업이 추가되기 때문에 인덱싱 비용이 따로 더 들게 된다.
key1+key2의 값을 Hash key로 쓴다던지 하는 약간의 꼼수를 발휘해서 해결할 수도 있다.

참조 : https://velog.io/@dankim/DynamoDB-%EC%A0%95%EB%A0%AC-%ED%82%A4%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%A0%95%EB%A6%AC%ED%95%98%EB%8A%94-%EB%AA%A8%EB%B2%94-%EC%82%AC%EB%A1%80

 

DynamoDB 정렬 키를 사용하여 데이터를 정리하는 모범 사례

DynamoDB 정렬 키를 사용하여 데이터를 정리하는 모범 사례

velog.io


참조한 형님들

https://velog.io/@hanseul/AWS-DynamoDB-%EC%82%AC%EC%9A%A9%EA%B8%B0#2-%EB%A1%9C%EC%BB%AC-%EB%B3%B4%EC%A1%B0-%EC%9D%B8%EB%8D%B1%EC%8A%A4-vs-%EA%B8%80%EB%A1%9C%EB%B2%8C-%EB%B3%B4%EC%A1%B0-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EC%B0%A8%EC%9D%B4

 

AWS DynamoDB 사용기_보조 인덱스 사용 위주로

AWS DynamoDB의 보조 인덱스 사용법

velog.io

 

https://www.slideshare.net/awskorea/amazon-dynamodb-for-developers

 

2017 AWS DB Day | 개발자가 알아야 할 Amazon DynamoDB 활용법

이 강연에서는 NoSQL 데이터베이스인 DynamoDB를 활용하기 위해 개발 실무자가 알아야 할 실용적 지식을 소개해 드립니다. 테이블을 설계하고 모범사례를 도입해 최적화된 성능과 비용으로 고가용

www.slideshare.net

 

'Amazon AWS' 카테고리의 다른 글

[AWS 개발환경]  (1) 2021.08.25
[CloudFront]  (0) 2021.07.13
[IAM]  (0) 2021.07.07

+ Recent posts