2014-11-18 20 views

Trả lời

16

Tôi nhớ đã thấy ai đó trả lời câu hỏi này trong danh sách gửi thư của người dùng Cassandra một thời gian ngắn, nhưng tôi không thể tìm thấy thông điệp chính xác ngay bây giờ. Trớ trêu thay, Cassandra Evangelist Rebecca Mills vừa đăng một bài viết giải quyết vấn đề này (Things you should be doing when using Cassandra drivers ... điểm # 13 và # 22). Nhưng câu trả lời là "có" rằng trong một số trường hợp, nhiều truy vấn song song sẽ nhanh hơn sử dụng IN. Lý do cơ bản có thể được tìm thấy trong DataStax SELECT documentation.

Khi không sử dụng TRÊN

... Sử dụng TRÊN có thể làm suy giảm hiệu suất vì thường nhiều nút phải được truy vấn. Ví dụ: trong một cụm trung tâm dữ liệu cục bộ duy nhất có 30 nút, hệ số nhân bản là 3 và mức độ nhất quán LOCAL_QUORUM, một truy vấn khóa đơn sẽ chuyển đến hai nút , nhưng nếu truy vấn sử dụng điều kiện IN, số lượng các nút được truy vấn có nhiều khả năng cao hơn, tối đa 20 nút tùy thuộc vào nơi các phím nằm trong phạm vi mã thông báo.

Vì vậy, dựa vào đó, có vẻ như điều này sẽ trở thành vấn đề lớn hơn khi cụm của bạn trở nên lớn hơn.

Do đó, cách tốt nhất để giải quyết vấn đề này (và không phải sử dụng IN) sẽ phải suy nghĩ lại mô hình dữ liệu của bạn cho truy vấn này. Nếu không biết quá nhiều về lược đồ của bạn, có lẽ có các thuộc tính (giá trị cột) được chia sẻ bởi ID vé 1, 2, 3 và 4. Có thể sử dụng thứ gì đó như cấp độ hoặc nhóm (nếu vé cho một địa điểm cụ thể) hoặc thậm chí có thể một sự kiện (id), thay vào đó.

Về cơ bản, khi sử dụng một độc đáo, định danh cao bản số để phân vùng dữ liệu của bạn âm thanh như một ý tưởng tốt, nó thực sự làm cho nó khó khăn hơn để truy vấn dữ liệu của bạn (trong Cassandra) sau này. Nếu bạn có thể tìm ra một cột khác để phân vùng dữ liệu của mình, điều đó chắc chắn sẽ giúp bạn trong trường hợp này. Bất kể, việc tạo một nhóm cột mới, cụ thể (bảng) để xử lý các truy vấn cho các hàng đó sẽ là một cách tiếp cận tốt hơn so với sử dụng IN hoặc nhiều truy vấn.

+0

còn truy vấn 'delete' thì sao? Tôi hiện đang có một truy vấn 'DELETE FROM xyz WHERE pkey IN (1,2,3,4)'. Toán tử IN có DELETE tốt hơn lệnh SELECT không? – pinkpanther

+1

@pinkpanther Nó phụ thuộc nếu bạn quan tâm đến hoạt động xóa đó hoạt động tốt. Nếu bạn có một số nút, tôi sẽ nghĩ rằng các vấn đề hiệu suất tương tự sẽ xảy ra với bạn. Nhưng nếu bạn chỉ thực hiện xóa bảo trì một lần, thì tôi sẽ không lo lắng về nó. – Aaron

+0

Lời khuyên để hợp nhất các bản ghi theo khóa phân vùng thẻ cao hơn là tốt để tối ưu hóa cho truy vấn IN, tuy nhiên bạn phải chú ý đến kích thước phân vùng. Điểm ngọt là khoảng 100MB vì ​​vậy nếu phân vùng của bạn trở nên lớn hơn nhiều, bạn nên nghĩ cách khác để phân chia nó. Vì mô hình dữ liệu là yếu tố quyết định lớn nhất về hiệu năng trong Cassandra, tôi đề nghị bạn tham gia [khóa học mô hình hóa dữ liệu] (https://academy.datastax.com/courses/ds220-data-modeling) từ Học viện DataStax. –

1

Có, tốt hơn là truy vấn riêng lẻ hơn là sử dụng IN trong Cassandra.

Đối với truy vấn này, điều phối viên phải lấy dữ liệu từ 4 phân vùng khác nhau và nếu mỗi phân vùng rất lớn thì dữ liệu được điền vào JVM có thể gây ra sự cố.

Thay vì truy vấn dữ liệu bằng nhiều truy vấn thì tốt hơn vì mỗi truy vấn là cá nhân và không phải đợi dữ liệu phân vùng khác gửi lại cho người dùng.

Các vấn đề liên quan