2012-08-11 24 views
23

Tôi đã đọc trong bản phát hành mới nhất rằng các cột siêu không mong muốn do "các vấn đề hiệu suất", nhưng không giải thích được điều này ở đâu.Tại sao các cột siêu trong Cassandra không còn được ưa chuộng?

Sau đó, tôi đọc các bài viết như this one cung cấp các mẫu lập chỉ mục tuyệt vời bằng cách sử dụng siêu cột.

Điều này khiến tôi không biết hiện là cách tốt nhất để lập chỉ mục trong Cassandra.

  1. Các vấn đề về hiệu suất của siêu cột là gì?
  2. Tôi có thể tìm thấy hiện tại các phương pháp hay nhất để lập chỉ mục ở đâu?
+2

Đó là một câu hỏi hay. Tôi nghĩ rằng blog công nghệ ebay này có một cái nhìn tổng quan về công nghệ tối ưu và công nghệ thấp (không có nhiều chi tiết công nghệ). http://www.ebaytechblog.com/2012/07/16/cassandra-data-modeling-best-practices-part-1/ Tuy nhiên, nếu bạn tham gia vào nội dung thực, hãy đọc tốt hơn từng thay đổi và lộ trình để bạn có được cảm thấy tốt hơn ở đâu và các vấn đề là gì và chúng được giải quyết như thế nào. Đó là quá nhiều đọc và nó sẽ được tốt đẹp nếu nó có thể được systemized một nơi nào đó, nhưng tôi cũng không thể tìm thấy nhiều trên internet. –

Trả lời

31

Siêu cột bị một số vấn đề, không kém phần quan trọng là Cassandra phải deserialze tất cả các cột phụ của cột siêu khi truy vấn (ngay cả khi kết quả sẽ chỉ trả về một tập hợp con). Kết quả là, có một giới hạn thực tế đối với số lượng cột phụ cho mỗi cột siêu có thể được lưu trữ trước khi hiệu suất bị ảnh hưởng. Về lý thuyết, điều này có thể được cố định trong Cassandra bằng cách lập chỉ mục các cột phụ, nhưng sự đồng thuận là các cột tổng hợp là một giải pháp tốt hơn, và chúng hoạt động mà không có sự phức tạp thêm vào.

Cách dễ nhất để tận dụng các cột tổng hợp là tận dụng lợi thế của sự trừu tượng mà CQL 3 cung cấp. Hãy xem xét lược đồ sau:

CREATE TABLE messages(
    username text, 
    sent_at timestamp, 
    message text, 
    sender text, 
    PRIMARY KEY(username, sent_at) 
); 

Tên người dùng ở đây là khóa hàng, nhưng chúng tôi đã sử dụng định nghĩa PRIMARY KEY tạo nhóm nhóm hàng và cột sent_at. Điều này rất quan trọng vì nó có tác dụng lập chỉ mục thuộc tính đó.

INSERT INTO messages (username, sent_at, message, sender) VALUES ('bob', '2012-08-01 11:42:15', 'Hi', 'alice'); 
INSERT INTO messages (username, sent_at, message, sender) VALUES ('alice', '2012-08-01 11:42:37', 'Hi yourself', 'bob'); 
INSERT INTO messages (username, sent_at, message, sender) VALUES ('bob', '2012-08-01 11:43:00', 'What are you doing later?', 'alice'); 
INSERT INTO messages (username, sent_at, message, sender) VALUES ('bob', '2012-08-01 11:47:14', 'Bob?', 'alice'); 

Đằng sau những cảnh Cassandra sẽ lưu trữ một cái gì đó chèn trên dữ liệu như thế này:

alice: (2012-08-01 11:42:37,message): Hi yourself, (2012-08-01 11:42:37,sender): bob 
bob: (2012-08-01 11:42:15,message): Hi,   (2012-08-01 11:42:15,sender): alice, (2012-08-01 11:43:00,message): What are you doing later?, (2012-08-01 11:43:00,sender): alice (2012-08-01 11:47:14,message): Bob?, (2012-08-01 11:47:14,sender): alice 

Nhưng sử dụng CQL 3, chúng ta có thể truy vấn "hàng" sử dụng một vị sent_at, và lấy lại một bảng tập hợp kết quả.

SELECT * FROM messages WHERE username = 'bob' AND sent_at > '2012-08-01'; 
username | sent_at     | message     | sender 
----------+--------------------------+---------------------------+-------- 
     bob | 2012-08-01 11:43:00+0000 | What are you doing later? | alice 
     bob | 2012-08-01 11:47:14+0000 |      Bob? | alice 
+0

Cảm ơn! Nói về các phím tổng hợp, Cassandra có thể thực hiện hiệu quả các truy vấn phạm vi trên mỗi cột không? CHỌN * TỪ một nơi nào đó WHERE a> 3 AND a <= 12 AND b IN (1, 3, 6) AND c> 17 vv, giả định khóa là a, b, c. – IamIC

+0

Hoặc là tên cột hỗn hợp (đa thành phần) tốt hơn cho trường hợp này? – IamIC

+0

bạn có thể xem xét điều này không: http://stackoverflow.com/questions/11978386/cassandra-1-1-storage-engine – IamIC