2012-08-11 31 views
23

我已經閱讀過最新版本,因爲「性能問題」,超級列是不可取的,但沒有解釋。爲什麼卡桑德拉的超級柱不再受青睞?

然後,我閱讀了文章,如this one,使用超級列提供美妙的索引模式。

這讓我不知道什麼是當前在卡桑德拉做索引的最好方法。

  1. 超級柱的性能問題是什麼?
  2. 我在哪裏可以找到當前索引的最佳實踐?
+2

這是一個很好的問題。我認爲這個易趣科技博客有一個很好的和低技術(沒有太多的技術細節)概述優化的體系結構。 http://www.ebaytechblog.com/2012/07/16/cassandra-data-modeling-best-practices-part-1/然而,如果你是真正的東西,更好地閱讀每個更新日誌和路線圖,所以你得到更好地感受問題出在哪裏以及如何解決。這是太多的閱讀,它會很好,如果它可以系統化的地方,但我也找不到在互聯網上。 – 2012-08-11 14:03:00

回答

31

超級列遇到很多問題,其中最重要的一點就是卡索德拉需要在查詢時對超級列的所有子列進行反序列化(即使結果只會返回一個很小的值子集)。因此,每個超級列的子列的數量在性能遭受損失之前可以存儲的數量是有實際限制的。

理論上,這可以在Cassandra中通過正確索引子列來修復,但共識是組合列是更好的解決方案,並且它們的工作沒有增加複雜性。

使用組合列的最簡單方法是利用CQL 3提供的抽象。考慮下面的模式:這裏

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

用戶名是該行關鍵,但我們使用它創建的行鍵和sent_at列進行分組主鍵定義。這很重要,因爲它具有索引該屬性的效果。

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'); 

場景卡桑德拉將存儲上面插入的數據是這樣的故事:

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 

但使用CQL 3,我們可以查詢「行」使用sent_at謂詞,並得到一個表格結果集。

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

謝謝!談到組合鍵,Cassandra能夠在每列上高效地執行範圍查詢嗎? SELECT * FROM where where a> 3 AND a <= 12 AND b IN(1,3,6)AND c> 17等,假設關鍵字是a,b,c。 – IamIC 2012-08-14 01:00:25

+0

或者是這種情況下更好的組合列名稱(多組件)? – IamIC 2012-08-14 01:16:25

+0

你可以看看這個請:http://stackoverflow.com/questions/11978386/cassandra-1-1-storage-engine – IamIC 2012-08-16 00:03:10