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.
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.
Câu trả lời:
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
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ố:
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.
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.
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.
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
Đây là những tìm kiếm có thể theo chỉ mục:
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);
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.lsi
và file.format.lsi2
. Bạn có thể, tuy nhiên, có file.format.lsi
và file.format2.lsi
hay file.format.lsi
và file2.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 fileName
làm Khóa Hash cơ sở và fileFormat
làm Phạm vi khóa cơ sở. Sau đó, bạn có thể chỉ định GSI có Khóa Hash và Khóa fileName2
phạm vi fileFormat2
. Sau đó, bạn có thể truy vấn trên một trong hai fileName
hoặc fileName2
nế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 fileName
và fileFormat
là Hash / Range cơ sở của bạn filePriority
và fileName
là 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.
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 đỡ)
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.
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.