Go#4-인덱스가 있는 DynamoDB
DynamoDB의 3회에서 우리는 너무 간단한 파일 시스템 모델을 구축했다.이 파일 시스템의 항목을 공유하면 같은 페이지에서 그 외관을 알 수 있습니다.
카탈로그
파일 이름
크기
돕다
report2017.pdf
1MB
기억하고 계신다면 다음과 같은 방법으로 파일 시스템을 조회할 수 있습니다.
우리가 무대에서 테스트를 할 때, 제품person은 고개를 들어 우리가 창설 시간에 따라 조회하고 있는 것을 보았는데, 그녀는 매우 좋아했다.한 가지 빼고는
너는 우리 고객이 파일의 창설 날짜를 이름에 쓰기를 기대할 수 없다
지금 우리는 별도의 요구가 있다.우리는 디렉터리 내의 파일을 만든 날짜에 따라 정렬할 수 있어야 한다.이것은 새로운 접근 모델이다.
이것은 SQL이 아닙니다. 우리는 간단하게
WHERE
및 ORDER BY
자구를 사용해서 추가 작업 없이 어떤 내용도 조회할 수 없습니다.DynamoDB에서 이 작업의 도구는 인덱스입니다.지수
DynamoDB의 테이블에는 주 파티션 키와 정렬 키가 한 쌍만 있을 수 있습니다.그것은 메인 키라고 불린다.그것들은 매우 중요하다. 왜냐하면 그것들은 조회의 입구점이기 때문이다.
그런데 왜 얘네가 절입점이야?이 질문에 대답하기 위해 DynamoDB가 데이터를 어떻게 저장하는지 생각해 봅시다.우선 어느 구역에 데이터를 저장할지 확인하는 데 사용할 섹션 키가 있습니다.DynamoDB는 파티션 키에 따라 해시 함수를 계산하고 파티션을 찾습니다.같은 섹션 키를 공유하는 모든 항목(항목 집합)은 하나의 B 트리 데이터 구조에 저장됩니다.B-트리의 중요한 점은 정렬 순서에 따라 데이터를 조회할 수 있다는 것이다.정렬 키는 트리에서 항목을 정렬하는 표준이기 때문에 여기서 매우 중요하다.어디 보자.
나는 B-트리가 아닌 두 갈래 검색 트리를 사용하여 간소화했지만, 이 트리들은 같은 정렬 가능한 속성을 가지고 있어서 주제를 둘러싸고 직감을 가지기에 충분하다.
위의 그림에 해당하는 데이터는 다음과 같습니다.
카탈로그(PK)
파일 이름(SK)
크기
작성 날짜
사진.
자전거파푸아뉴기니
1.2MB
2017-03-04 00:00:00+0000 UTC
사진.
아파트회사 명
4MB
2018-06-25 00:00:00+0000 UTC
사진.
조부파푸아뉴기니
3MB
2019-04-01 00:00:00+0000 UTC
사진.
얘들아.파푸아뉴기니
3MB
2020-01-10 00:00:00+0000 UTC
우리가 여기에 있는 입구점은
photos
디렉터리에서 항목을 얻고 파일 이름에 따라 정렬할 수 있는 것이다.이것은 바로 그림에 반영된다. 왜냐하면 나무의 구조 방식은 filename
에 따라 정렬할 수 있기 때문이다.만약 우리가 서로 다른 접점을 원한다면, 우리는 색인을 도입해야 한다.색인은 추가 섹션 키와 정렬 키를 도입하여 조회표의 능력을 향상시킨다.
DynamoDB는 두 가지 유형의 지수가 있는데 그것이 바로 부분 2급 지수(LSI)와 전역 2급 지수(GSI)이다.부차적인 것은 그것들이 메인 키의 추가 항목이라는 것을 의미한다.
로컬 2 레벨 인덱스
LSI는 주 키와 같은 파티션 키를 가지지만 정렬 키는 다르다.이것은 우리가 추가 속성에 따라 항목을 정렬할 수 있도록 합니다.이를 위해 DynamoDB는 추가 재구성 트리를 저장해야 합니다.모든 정렬 모드는 자신의 트리가 있어야 한다.
우리의 추가 접근 모드는
created_at
속성에 따라 정렬됩니다.이것은 추가 트리가 created_at
순서대로 정렬된다는 것을 의미한다.우리 이 그림을 보고 머리를 돌려 봅시다.LSI는 표 자체와 같은 섹션 키를 가져야 한다. 이것이 바로 그것이 왜 로컬인지이다.우리는 LSI의 주 정렬 키와 정렬 키를 찾기 위해 같은 구역을 사용할 수 있다.LSI의 중요한 제한은 테이블을 만들 때 LSI를 만들어야 한다는 것이다.단일 테이블에는 최대 5개의 LSI가 있을 수 있습니다.
글로벌 2단계 인덱스
GSI는 다르다.그것은 같은 테이블에 임의의 섹션 키와 정렬 키를 사용할 수 있습니다.섹션 키는
size
이고 filename
는 정렬 키입니다.이것은 사진 크기에 따라 그룹을 나누는 조회를 실행할 수 있습니다.색인에 있는 섹션 키가 완전히 다르기 때문에, 우리는 더 이상 색인을 메인 키 근처에 유지할 수 없습니다.우리는 새로운 데이터 구조를 구축해야 한다.이것이 바로 이 지수가 전 세계적인 이유이다. 다른 곳에 존재한다고 할 수 있다.GSI는 당신이 상상하는 어떤 방식으로든 표를 조회할 수 있기 때문에 매우 중요하다.LSI와 반대로 테이블 라이프 사이클 동안 언제든지 GSI를 생성할 수 있습니다.각 테이블에는 최대 20개의 GSI가 있습니다.
데이터베이스 레이아웃
비즈니스 문제를 해결하는 데 집중하고
created_at
정렬을 허용하는 LSI를 만들 것입니다.Resources:
FileSystemTable:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: directory
AttributeType: S
- AttributeName: filename
AttributeType: S
- AttributeName: created_at
AttributeType: S
KeySchema:
- AttributeName: directory
KeyType: HASH
- AttributeName: filename
KeyType: RANGE
LocalSecondaryIndexes:
- IndexName: ByCreatedAt
KeySchema:
- AttributeName: directory
KeyType: HASH
- AttributeName: created_at
KeyType: RANGE
Projection:
ProjectionType: ALL
BillingMode: PAY_PER_REQUEST
TableName: FileSystemTable
이것은 우리가 이전에 세 번째 epiode에서 얻은 것과 매우 비슷하다. 단지 두 가지만 다르다.첫 번째 차이점은 우리가 새로운 큰 단락LocalSecondaryIndexes
을 가지고 있는데 그 중에서 색인이 하나 있다는 것이다.나는 ByCreatedAt
라고 부른다. 왜냐하면 이것은 기본적으로 내가 하고 싶은 것이기 때문이다. - 나는 만들 때 조회하고 싶다.만약 우리가 안을 본다면, 우리는 복합 키 정의와 매우 유사한 것들을 볼 수 있을 것이다.KeySchema
및 RANGE
키가 있습니다.두 번째 차이점은 새로운 속성 정의가 생겼다는 것이다.HASH
인덱스의 RANGE
키는 CreatedAt
속성을 사용하기 때문에 이를 정의해야 합니다.type item struct {
Directory string `dynamodbav:"directory"`
Filename string `dynamodbav:"filename"`
Size string `dynamodbav:"size"`
CreatedAt time.Time `dynamodbav:"created_at"`
}
created_at
에도 변화가 생겼다.그것은 새로운 속성을 가지고 있다-item
.조회#1-2019년 촬영 사진
모든 질의의 초기 설정은 동일합니다.다만:
ctx := context.Background()
tableName := "FileSystemTable"
db, cleanup := dynamo.SetupTable(t, ctx, tableName, "./template.yml")
defer cleanup()
이제 관건적인 조건 표현식을 구축합시다.expr, err := expression.NewBuilder().
WithKeyCondition(
expression.KeyAnd(
expression.KeyEqual(
expression.Key("directory"),
expression.Value("photos"),
),
expression.KeyGreaterThanEqual(
expression.Key("created_at"),
expression.Value(time.Date(2019, 1, 1, 0, 0, 0, 0, time.UTC)),
))).
Build()
나는 조회를 위해 정확한 목록을 제공해야 한다.그 밖에 나는 색인을 이용하기 위해 CreatedAt
를 사용한다.그러나 이 표현식의 측면에서 볼 때 색인은 보이지 않는다.가령 표에서 KeyGreaterThanEqual
는 섹션 키이고 directory
는 정렬 키이며 유효한 표현식이다.여기서 중점은 테이블에 정렬 키가 많을 수 없다는 것이다. - 색인을 사용해야 한다. 그러나 이것은 추가 정렬 키로 사용할 수 있고 표현식에 큰 영향을 미치지 않는다.out, err := db.QueryWithContext(ctx, &dynamodb.QueryInput{
ExpressionAttributeNames: expr.Names(),
ExpressionAttributeValues: expr.Values(),
KeyConditionExpression: expr.KeyCondition(),
TableName: aws.String(table),
IndexName: aws.String("ByCreatedAt"),
})
assert.Len(t, out.Items, 2)
보시다시피, 저희가 사용하고 있는 색인을 지정해야 합니다.만약 우리가 -DynamoDB를 지정하지 않는다면 불평 키 조건 표현식은 정렬 키 created_at
가 아니라 다른 필드 ByCreatedAt
가 있습니다.마지막으로 나는 단지 검사 결과가 두 가지로 구성되었는지 여부만 검사할 뿐이다.조회#2-2017년부터 2018년까지 촬영한 사진
이 검색은 첫 번째 검색과 완전히 같아 보이지만, 이 검색을 구성하는 데 사용되는 관건적인 조건 표현식은 제가 보여 드리고 싶은 새로운 연산자를 사용합니다.
expr, err := expression.NewBuilder().
WithKeyCondition(
expression.KeyAnd(
expression.KeyEqual(
expression.Key("directory"),
expression.Value("photos"),
),
expression.KeyBetween(
expression.Key("created_at"),
expression.Value(
time.Date(2017, 1, 1, 0, 0, 0, 0, time.UTC)),
expression.Value(
time.Date(2019, 1, 1, 0, 0, 0, 0, time.UTC))))).
Build()
이렇게 간단하다. 검색의 하한선과 상한선을 설정하면 2017년부터 2018년까지의 사진을 얻을 수 있다.조회#3 - 최신 사진
인덱스는 항목(인덱스의 정렬 키에 따라 정렬)을 순서대로 저장하기 때문에 우리는 새로운 방식으로 데이터에 접근할 수 있다.섹션 키만 지정하는 키 조건 표현식이 필요합니다. 그러면 포토스 디렉터리에 있습니다.
expr, err := expression.NewBuilder().
WithKeyCondition(expression.KeyEqual(expression.Key("directory"), expression.Value("photos"))).
Build()
관건적인 조건 표현식이 더욱 간단해지면서 조회 자체도 더욱 복잡해진다.out, err := db.QueryWithContext(ctx, &dynamodb.QueryInput{
ExpressionAttributeNames: expr.Names(),
ExpressionAttributeValues: expr.Values(),
KeyConditionExpression: expr.KeyCondition(),
TableName: aws.String(table),
IndexName: aws.String("ByCreatedAt"),
ScanIndexForward: aws.Bool(false),
Limit: aws.Int64(1),
})
우선, 우리는 색인을 뒤로 훑어보고 싶지 않다는 것을 지정해야 한다. 기본적으로 색인은 승순으로 데이터를 저장하기 때문이다. 우리는 filename
파라미터를 사용하기 때문이다.그 다음으로, 우리는 조회 결과를 하나의 항목으로 제한하기를 희망한다.만약 이 점이 없다면, 우리는 최신 사진에서 가장 오래된 사진으로 돌아갈 것이다.마지막으로, 우리는 단지 우리가 얻은 물건이 정말 최신품인지 검증할 뿐이다.
var items []item
err = dynamodbattribute.UnmarshalListOfMaps(out.Items, &items)
assert.Equal(t, 2020, items[0].CreatedAt.Year())
총결산
이번 회는 지수에 관한 것이다.우선, 우리는 그것들이 어떻게 작동하는지에 대해 직각을 세운 다음에 국부 2급 인덱스를 사용하여 추가 속성을 통해 조회한다.
색인은 DynamoDB에서 중요한 개념으로 더욱 복잡한 데이터 모델을 처리할 때 우리는 더 많은 색인을 볼 수 있다.
다시 한 번. - 이 저장소를 복제해서 검색해 달라고 초대합니다!
Reference
이 문제에 관하여(Go#4-인덱스가 있는 DynamoDB), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jbszczepaniak/dynamodb-with-go-4-indexes-3doi텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)