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
참조한 형님들
https://www.slideshare.net/awskorea/amazon-dynamodb-for-developers
'Amazon AWS' 카테고리의 다른 글
[AWS 개발환경] (1) | 2021.08.25 |
---|---|
[CloudFront] (0) | 2021.07.13 |
[IAM] (0) | 2021.07.07 |