Sự khác biệt giữa các chỉ mục địa phương và toàn cầu trong DynamoDB


128

Tôi tò mò về hai chỉ số phụ và sự khác biệt giữa chúng. Thật khó để tưởng tượng điều này trông như thế nào. Và tôi nghĩ, điều này sẽ giúp nhiều người hơn là chỉ tôi.


1
Đã trả lời trong Câu hỏi thường gặp về DynamoDB . Tìm kiếm "Làm thế nào để chỉ mục phụ toàn cầu khác với chỉ mục phụ địa phương?"
đánh dấu

1
Không dễ dàng để tìm thấy từ FAQ bây giờ. Có lẽ nó được tổ chức lại
binithb

Câu trả lời:


114

Chỉ số phụ địa phương vẫn dựa vào Khóa Hash gốc. Khi bạn cung cấp bảng có hàm băm + phạm vi, hãy nghĩ về LSI là hàm băm + phạm vi1, hàm băm + phạm vi2 .. hàm băm + phạm vi6. Bạn nhận được thêm 5 thuộc tính phạm vi để truy vấn. Ngoài ra, chỉ có một thông lượng được cung cấp.

Chỉ số phụ toàn cầu xác định một mô hình mới - các khóa băm / phạm vi khác nhau cho mỗi chỉ mục.
Điều này phá vỡ cách sử dụng ban đầu của một khóa băm trên mỗi bảng. Đây cũng là lý do tại sao khi xác định GSI, bạn được yêu cầu thêm thông lượng được cung cấp cho mỗi chỉ mục và trả tiền cho nó.

Thông tin chi tiết hơn về sự khác biệt có thể được tìm thấy trong thông báo của GSI


2
Có thể thêm 1) chỉ mục phụ, cho dù LSI hay GSI, không liên quan gì đến tính duy nhất
user1322092

1
Bạn được phép có tối đa 5 Chỉ số phụ địa phương, đó là lý do Chen Harel nói "Bạn có thêm 5 thuộc tính phạm vi để truy vấn" .
Felipe Alvarez

93

Dưới đây là định nghĩa chính thức từ tài liệu:

Chỉ mục phụ toàn cầu - một chỉ mục có khóa băm và phạm vi có thể khác với chỉ số trên bảng. Một chỉ mục phụ toàn cầu được coi là "toàn cầu" vì các truy vấn trên chỉ mục có thể bao trùm tất cả dữ liệu trong một bảng, trên tất cả các phân vùng.

Chỉ mục phụ cục bộ - một chỉ mục có cùng khóa băm với bảng, nhưng một khóa phạm vi khác. Một chỉ mục phụ cục bộ là "cục bộ" theo nghĩa là mọi phân vùng của một chỉ mục phụ cục bộ được đặt trong một phân vùng bảng có cùng khóa băm.

Tuy nhiên, sự khác biệt vượt xa khả năng về các định nghĩa chính. Tìm bên dưới một số yếu tố quan trọng sẽ ảnh hưởng trực tiếp đến chi phí và nỗ lực để duy trì các chỉ số:

  • Thông lượng:

Chỉ số phụ địa phương tiêu thụ thông lượng từ bảng. Khi bạn truy vấn các bản ghi thông qua chỉ mục cục bộ, thao tác sẽ tiêu thụ các đơn vị dung lượng đọc từ bảng. Khi bạn thực hiện thao tác ghi (tạo, cập nhật, xóa) trong một bảng có chỉ mục cục bộ, sẽ có hai thao tác ghi, một cho bảng khác cho chỉ mục. Cả hai hoạt động sẽ tiêu thụ đơn vị công suất ghi từ bảng.

Chỉ mục phụ toàn cầu có thông lượng được cung cấp riêng, khi bạn truy vấn chỉ mục, thao tác sẽ tiêu thụ dung lượng đọc từ chỉ mục, khi bạn thực hiện thao tác ghi (tạo, cập nhật, xóa) trong bảng có chỉ mục chung, sẽ có hai viết các thao tác, một cho bảng khác cho chỉ mục *.

* Khi xác định thông lượng được cung cấp cho Chỉ số phụ toàn cầu, hãy đảm bảo bạn đặc biệt chú ý đến các yêu cầu sau:

Để ghi bảng thành công, các cài đặt thông lượng được cung cấp cho bảng và tất cả các chỉ mục phụ toàn cầu của nó phải có đủ khả năng ghi để phù hợp với ghi; nếu không, ghi vào bảng sẽ được điều chỉnh.

  • Sự quản lý :

Chỉ mục phụ cục bộ chỉ có thể được tạo khi bạn đang tạo bảng, không có cách nào để thêm Chỉ mục phụ cục bộ vào bảng hiện có, một khi bạn tạo chỉ mục bạn không thể xóa bảng.

Chỉ số phụ toàn cầu có thể được tạo khi bạn tạo bảng và thêm vào bảng hiện có, xóa Chỉ mục phụ toàn cầu hiện có cũng được cho phép.

  • Đọc tính nhất quán:

Chỉ số phụ địa phương hỗ trợ tính nhất quán cuối cùng hoặc mạnh mẽ, trong khi đó, chỉ số phụ toàn cầu chỉ hỗ trợ tính nhất quán cuối cùng.

  • Chiếu:

Chỉ mục phụ cục bộ cho phép truy xuất các thuộc tính không được chiếu vào chỉ mục (mặc dù có thêm chi phí: hiệu suất và đơn vị dung lượng tiêu thụ). Với Chỉ số phụ toàn cầu, bạn chỉ có thể truy xuất các thuộc tính được chiếu vào chỉ mục.

Cân nhắc đặc biệt về tính duy nhất của các khóa được xác định theo chỉ mục phụ:

Trong Chỉ mục phụ cục bộ, giá trị khóa phạm vi KHÔNG cần phải là duy nhất cho một giá trị khóa băm nhất định, điều tương tự áp dụng cho Chỉ mục phụ toàn cầu, các giá trị khóa (Hash và Phạm vi) KHÔNG cần phải là duy nhất.

Nguồn: http://docs.aws.amazon.com/amazondoperodb/latest/developerguide/SecondaryIndexes.html


1
" Chỉ mục phụ toàn cầu có thông lượng được cung cấp riêng, khi bạn truy vấn chỉ mục, thao tác sẽ tiêu thụ dung lượng đọc từ bảng " - Sai. Các truy vấn hoặc quét trên một chỉ mục phụ toàn cầu tiêu thụ các đơn vị năng lực từ chỉ mục, không phải từ bảng cơ sở.
ethanxyz_0

1
@bsd Sẽ rất hợp lý khi thêm một lưu ý về một hạn chế chính mà việc sử dụng LSI áp đặt: "Đối với các bảng có chỉ mục phụ cục bộ, có giới hạn kích thước 10 GB cho mỗi giá trị khóa phân vùng. Một bảng có chỉ mục phụ cục bộ có thể lưu trữ bất kỳ số lượng vật phẩm, miễn là tổng kích thước cho bất kỳ một giá trị khóa phân vùng nào không vượt quá 10 GB. " ( docs.aws.amazon.com/amazondoperodb/latest/developerguide/iêng )
wvdz

29

Đây là những tìm kiếm có thể theo chỉ mục:

  • Bởi Hash
  • Theo Hash + Phạm vi
  • Theo Hash + Chỉ mục địa phương
  • Theo chỉ số toàn cầu
  • Theo chỉ số toàn cầu + Chỉ số phạm vi

Các chỉ mục Hash và Range của một bảng: Đây là các chỉ mục thông thường của các phiên bản trước của SDK AWS của Amazon.

Các chỉ mục toàn cầu và cục bộ: Đây là các chỉ mục 'bổ sung' được tạo trên một bảng, ngoài các chỉ mục băm và phạm vi hiện có của bảng. Chỉ số toàn cầu tương tự như một hàm băm. Chỉ mục phạm vi hoạt động tương tự như chỉ mục phạm vi được sử dụng với hàm băm của bảng. Trong mô hình thực thể của bạn trong mã của bạn, getter phải được chú thích theo cách này:

  • Đối với các chỉ số toàn cầu:

    @DynamoDBIndexHashKey(globalSecondaryIndexName = INDEX_GLOBAL_RANGE_US_TS)
    @DynamoDBAttribute(attributeName = PROPERTY_USER)
    public String getUser() {
        return user;
    }
    
  • Đối với chỉ mục phạm vi được liên kết với chỉ mục toàn cầu:

    @DynamoDBIndexRangeKey(globalSecondaryIndexName = INDEX_GLOBAL_RANGE_US_TS)
    @DynamoDBAttribute(attributeName = PROPERTY_TIMESTAMP)
    public String getTimestamp() {
        return timestamp;
    }
    

Ngoài ra, nếu bạn đọc một bảng theo chỉ mục Toàn cầu, thì đó phải là một Sự kiện đọc (không phải đọc nhất quán):

queryExpression.setConsistentRead(false);

20

Một cách để đặt nó là:

LSI - cho phép bạn thực hiện một truy vấn trên một Hash-Key duy nhất trong khi sử dụng nhiều thuộc tính khác nhau để "lọc" hoặc hạn chế truy vấn.

GSI - cho phép bạn thực hiện các truy vấn trên nhiều Khóa Hash trong một bảng, nhưng kết quả là chi phí tăng thêm thông lượng.

Bảng phân tích chi tiết hơn về các loại bảng và cách chúng hoạt động, bên dưới:

Chỉ băm

Như bạn có thể đã biết; Bản thân một Hash-Key phải là duy nhất khi ghi vào Hash-Key đã tồn tại sẽ ghi đè lên dữ liệu hiện có.

Hash + Phạm vi

Khóa Hash-Key + Range-Key cho phép bạn có nhiều Khóa Hash giống nhau, miễn là chúng có khóa phạm vi khác nhau. Trong trường hợp này, nếu bạn viết vào Hash-Key đã tồn tại, nhưng sử dụng Key-Key chưa được sử dụng bởi Hash-Key đó, nó sẽ tạo một mục mới, trong khi nếu một mục có cùng kết hợp Hash + Range đã tồn tại, nó ghi đè lên mục phù hợp.

Một cách khác để nghĩ về điều này giống như một tập tin với định dạng. Bạn có thể có một tệp có cùng tên (băm) với tên khác, trong cùng một thư mục (bảng), miễn là định dạng (phạm vi) của chúng là khác nhau. Tương tự như vậy, bạn có thể có nhiều tệp có cùng định dạng miễn là tên của chúng khác nhau.

LSI

LSI về cơ bản giống như Hash-Key + Range-Key và tuân theo các quy tắc tương tự như khi tạo các mục, ngoại trừ việc bạn cũng phải cung cấp các giá trị cho LSI; chúng không thể để trống / null.

Có thể nói LSI là "Phạm vi khóa 2" không hoàn toàn chính xác vì bạn không thể có (sử dụng tệp tương tự và định dạng của tôi từ trước đó) một tệp có tên: file.format.lsifile.format.lsi2. Bạn có thể, tuy nhiên, có file.format.lsifile.format2.lsihay file.format.lsifile2.format.lsi.

Về cơ bản, LSI chỉ là "Khóa bộ lọc", không phải là Khóa phạm vi thực tế; kết hợp giá trị Hash và Phạm vi cơ sở của bạn vẫn phải là duy nhất trong khi các giá trị LSI hoàn toàn không phải là duy nhất. Một cách dễ dàng hơn để xem xét nó có thể là nghĩ về LSI như dữ liệu trong các tệp. Bạn có thể viết mã tìm tất cả các tệp có tên "PRO DỰ ÁN 101", bất kể chúng là gì fileFormat, sau đó đọc dữ liệu bên trong để xác định những gì nên được bao gồm trong truy vấn và những gì được bỏ qua. Về cơ bản, đây là cách LSI hoạt động (chỉ cần không có thêm chi phí mở tệp để đọc nội dung của nó).

GSI

Đối với GSI, về cơ bản, bạn đang tạo một bảng khác cho mỗi GSI, nhưng không gặp khó khăn trong việc duy trì nhiều bảng riêng biệt phản ánh dữ liệu giữa chúng; đây là lý do tại sao họ chi phí thông lượng nhiều hơn.

Vì vậy, đối với GSI, bạn có thể chỉ định fileNamelàm Khóa Hash cơ sở và fileFormatlàm Phạm vi khóa cơ sở. Sau đó, bạn có thể chỉ định GSI có Khóa Hash và Khóa fileName2phạm vi fileFormat2. Sau đó, bạn có thể truy vấn trên một trong hai fileNamehoặc fileName2nếu bạn thích, không giống như LSI nơi bạn chỉ có thể truy vấn fileName.

Ưu điểm chính là bạn chỉ phải duy trì một bảng, thay vì 2 và bất cứ khi nào bạn viết vào Hash / Range chính hoặc Hash / Range GSI, các bảng khác cũng sẽ tự động được cập nhật, vì vậy bạn không thể "quên" cập nhật (các) bảng khác như bạn có thể với thiết lập nhiều bảng. Ngoài ra, không có khả năng mất kết nối sau khi cập nhật một và trước khi cập nhật kết nối khác, giống như với thiết lập nhiều bảng.

Ngoài ra, GSI có thể "chồng lấp" tổ hợp Hash / Range cơ sở. Vì vậy, nếu bạn muốn tạo một bảng với fileNamefileFormatlà Hash / Range cơ sở của bạn filePriorityfileNamelà GSI của bạn, bạn có thể.

Cuối cùng, kết hợp GSI Hash + Range không nhất thiết phải là duy nhất, trong khi kết hợp Hash + Range cơ sở phải là duy nhất. Đây là điều không thể với thiết lập bảng kép / đa, nhưng với GSI. Do đó, bạn PHẢI cung cấp các giá trị cho cả cơ sở VÀ GSI Hash + Range khi cập nhật; không có giá trị nào trong số này có thể trống / null.


13

Một cách khác để giải thích: LSI giúp bạn thực hiện các truy vấn bổ sung trên các mục có cùng Hash Hash. GSI giúp bạn thực hiện các truy vấn tương tự trên các mục "trên bàn". Vì vậy, rất hữu ích.

Nếu bạn có bảng hồ sơ người dùng: unique-id, name, email. Ở đây nếu bạn cần làm cho bảng có thể truy vấn được về tên, email - thì cách duy nhất là làm cho chúng trở thành GSI (LSI không giúp đỡ)


1

Tài liệu này đưa ra lời giải thích khá tốt:

https://aws.amazon.com/bloss/aws/now-av Available-global-secondary-index-for-amazon -dynamodb /

Tôi không thể nhận xét về Câu hỏi này, nhưng tốt hơn về mặt hiệu suất viết và đọc:

(Chỉ mục cục bộ với thông lượng đọc và ghi của bảng là 100) hoặc (Chỉ mục toàn cầu với thông lượng đọc / ghi là 50 cùng với thông lượng đọc / ghi của bảng là 50?)

Tôi không cần khóa phân vùng riêng cho trường hợp sử dụng của mình, vì vậy chỉ mục cục bộ phải đủ cho chức năng được yêu cầu.


0

GSI không thể được sử dụng để đọc nhất quán.

LSI có thể được sử dụng để đọc nhất quán nhưng chúng sẽ giới hạn kích thước phân vùng chính là 10GB. Ngoài ra LSI chỉ có thể được tạo trên bảng tạo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.