Sự khác biệt giữa quét và truy vấn trong dynamicodb là gì? Khi nào sử dụng quét / truy vấn?


84

Hoạt động truy vấn như được chỉ định trong tài liệu DynamoDb:

Thao tác truy vấn chỉ tìm kiếm các giá trị thuộc tính khóa chính và hỗ trợ một tập hợp con các toán tử so sánh trên các giá trị thuộc tính chính để tinh chỉnh quá trình tìm kiếm.

và hoạt động quét:

Thao tác quét sẽ quét toàn bộ bảng. Bạn có thể chỉ định bộ lọc áp dụng cho kết quả để tinh chỉnh các giá trị trả về cho bạn, sau khi quét hoàn tất.

Tốt nhất là dựa trên Cân nhắc Hiệu suất và Chi phí.

Câu trả lời:


52

Khi tạo bảng Dynamodb, hãy chọn Khóa chính và Chỉ mục phụ cục bộ (LSI) để hoạt động Truy vấn trả về các mục bạn muốn.

Các thao tác truy vấn chỉ hỗ trợ đánh giá toán tử ngang nhau của Khóa chính, nhưng có điều kiện (=, <, <=,>,> =, Giữa, Bắt đầu) trên Khóa sắp xếp.

Các thao tác quét thường chậm hơn và tốn kém hơn vì thao tác này phải lặp lại qua từng mục trong bảng của bạn để nhận được các mục bạn yêu cầu.

Thí dụ:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType

Trong ví dụ này, bạn có thể sử dụng thao tác Truy vấn để nhận:

  1. Một CustomerId với bộ lọc có điều kiện trên AccountType

Thao tác Quét sẽ cần được sử dụng để trả về:

  1. Tất cả Khách hàng có Loại tài khoản cụ thể
  2. Các mặt hàng dựa trên bộ lọc có điều kiện theo Quốc gia, tức là Tất cả khách hàng từ Hoa Kỳ
  3. Các mặt hàng dựa trên bộ lọc có điều kiện theo LastPurchase, tức là Tất cả khách hàng đã mua hàng trong tháng trước

Để tránh các thao tác quét trên các thao tác được sử dụng thường xuyên, tạo Chỉ mục phụ cục bộ (LSI) hoặc Chỉ mục phụ toàn cầu (GSI).

Thí dụ:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase

Trong ví dụ này, một hoạt động Truy vấn có thể cho phép bạn nhận được:

  1. Một CustomerId với bộ lọc có điều kiện trên AccountType
  2. [GSI] Một bộ lọc có điều kiện trên CustomerIds cho một Loại tài khoản cụ thể
  3. [LSI] Một CustomerId có bộ lọc có điều kiện trên LastPurchase

1
nếu Khóa chính: CustomerId + AccountType (Tôi hiểu rằng CustomerID là khóa phân vùng và AccountType là khóa sắp xếp) Tôi nghĩ bạn chỉ có thể chạy một hoạt động Truy vấn bằng CustomerID hoặc bằng CustomerID + AccountType. Nếu bạn tìm kiếm bằng cách AccountType chỉ nó sẽ là một quét
Adil

1
Cảm ơn @Adil. Bạn đúng, tôi đã chỉnh sửa câu trả lời của mình để phản ánh điều này.
Kinman,


34

Bạn đang có khóa phân vùng bảng động / khóa chính dưới dạng customer_country. Nếu bạn sử dụng truy vấn, customer_countrylà trường bắt buộc để thực hiện thao tác truy vấn. Tất cả các bộ lọc chỉ có thể được tạo ra các mục thuộc về customer_country.

Nếu bạn thực hiện quét bảng, bộ lọc sẽ được thực hiện trên tất cả khóa phân vùng / khóa chính. Đầu tiên nó tìm nạp tất cả dữ liệu và áp dụng bộ lọc sau khi tìm nạp từ bảng.

ví dụ:

đây customer_countrykhóa phân vùng / khóa chínhidkhóa_sắp xếp

-----------------------------------

customer_country | name   | id

-----------------------------------
VV               | Tom    | 1

VV               | Jack   | 2

VV               | Mary   | 4

BB               | Nancy  | 5

BB               | Lom    | 6

BB               | XX     | 7

CC               | YY     | 8

CC               | ZZ     | 9

------------------------------------
  • Nếu bạn thực hiện thao tác truy vấn, nó chỉ áp dụng trên customer_countrygiá trị. Giá trị chỉ nên là toán tử bằng (=).

  • Vì vậy, chỉ các mục bằng giá trị khóa / khóa chính của phân vùng đó mới được tìm nạp.

  • Nếu bạn thực hiện thao tác quét, nó sẽ tìm nạp tất cả các mục trong bảng đó và lọc ra dữ liệu sau khi lấy dữ liệu đó.

Lưu ý: Không thực hiện thao tác quét vì nó vượt quá RCU của bạn.


Bạn có thể nêu nguồn câu trả lời của mình không?
AlikElzin-kilaka


10

Truy vấn tốt hơn nhiều so với Quét - một cách khôn ngoan. quét, như tên của nó, sẽ quét toàn bộ bảng. Nhưng bạn phải biết rõ về khóa bảng, khóa sắp xếp, các chỉ mục và các chỉ mục sắp xếp liên quan để biết rằng bạn có thể sử dụng Truy vấn. nếu bạn lọc truy vấn của mình bằng cách sử dụng:

  • Chìa khóa
  • khóa & sắp xếp khóa
  • mục lục
  • chỉ mục và khóa sắp xếp liên quan của nó

sử dụng Truy vấn! nếu không, hãy sử dụng quét linh hoạt hơn về những cột bạn có thể lọc.

bạn KHÔNG thể truy vấn nếu:

  • thêm rằng 2 trường trong bộ lọc (ví dụ: khóa, sắp xếp và chỉ mục)
  • chỉ sắp xếp khóa (của khóa chính hoặc chỉ mục)
  • các trường thông thường (không phải khóa, chỉ mục hoặc sắp xếp)
  • chỉ mục hỗn hợp và sắp xếp (chỉ mục1 với sắp xếp chỉ mục2) \
  • ...

một giải thích hay: https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f


9

Về mặt hiệu suất, tôi nghĩ rằng bạn nên thiết kế bảng của mình cho các ứng dụng sử dụng Querythay thế Scan. Bởi vì thao tác quét luôn quét toàn bộ bảng trước khi nó lọc ra các giá trị mong muốn, có nghĩa là cần nhiều thời gian và không gian hơn để xử lý các thao tác dữ liệu như đọc, ghi và xóa. Để biết thêm thông tin, vui lòng tham khảo tài liệu chính thức


7

Nó tương tự như trong cơ sở dữ liệu quan hệ.

Nhận querybạn đang sử dụng một khóa chính trong wheređiều kiện, Sự phức tạp tính toán là log(n)như hầu hết các cấu trúc quan trọng là cây nhị phân.

trong khi scantruy vấn, bạn phải quét toàn bộ bảng sau đó áp dụng bộ lọc trên từng bảng rowđể tìm ra kết quả phù hợp. Hiệu suất là O(n). Nó chậm hơn nhiều nếu bàn của bạn lớn.

Tóm lại, Hãy thử sử dụng getnếu bạn biết khóa chính. chỉ scandành cho trường hợp xấu nhất.

Ngoài ra, hãy nghĩ về chỉ mục phụ toàn cầu để hỗ trợ một loại truy vấn khác trên các khóa khác nhau để đạt được mục tiêu hiệu suất

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.