2012-08-15 55 views
6

我想了解卡桑德拉的存儲引擎,當涉及到複合列。不幸的是,到目前爲止我所閱讀的文檔都包含錯誤,並且讓我有點空白。Cassandra 1.1存儲引擎如何存儲複合材料?

首先,術語。

複合列使用 複合主鍵包含完全非規格化的寬行。

這似乎有誤導性,因爲AFAIK複合列可以用於複合鍵,也可以簡單地作爲除鍵之外的複合列。

1:如何實現組合鍵和列名稱?我能找到的每個CQL示例僅將組合鍵顯示爲列,而不是簡單的組合列。假設我們有列'a','b','c','d'作爲主要組合鍵+列'e','f'。我知道'a'將是行和分區鍵。

讓我們假設以下數據:

a b c d e f 
1a 1b 1c 1d e1 f1 
1a 1b 1c 2d e1 f2 
1a 1b 1c 2d e2 f3 
2a 2b 2c 2d e2 f4 

2:這是如何存儲在引擎蓋下?我想這裏真正的問題是'b','c','d'是如何映射出來的,因爲根據定義,列不是分層的。

3:我讀的文件說不應該再使用緊湊型存儲器。但是,如果不需要添加非主鍵列,那該怎麼辦?那麼不使用它的原因是什麼?

回答

2

1:如何實現組合鍵和列名稱?

主要用問題2回答。另外,在Cassandra 1.2中,非複合鍵也將作爲組合鍵實現。此外,複合列的名稱本身在存儲中不會重複。內存中的表示對名稱進行了處理,使內存效率達到一個閾值。

2:這是如何存儲在引擎蓋下?

第一個關鍵組件(在您的示例中爲a)成爲物理行鍵。其餘的列形成非複合列的前綴,並在一行中存儲預分類(聚集)。所以,你的榜樣物理表示會是這樣:

1b.1c.1d, e 1b.1c.1d, f 
1a  e1   f1 
------------------------------ 
    2b.2c.2d, e 2b.2c.2d, f 
2a  e2   f4 

注意,在您的示例中的第二和第三行是無效。列名在物理行中必須是唯一的。

我使用的點符號(1b.1c.1d)是比喻性的。實際存儲使用元數據前綴字節,後跟數據。

我讀過的文檔說不應再使用緊湊型存儲。但是,如果不需要添加非主鍵列,那該怎麼辦?那麼不使用它的原因是什麼?

非常小的存儲效率不值得在架構中不具有可演化性的缺點。

+0

非常感謝您! – IamIC 2012-08-22 16:00:55

+0

你是什麼意思的「非複合鍵」?關鍵是一個組件(無列)還是複合(1個組合列)? – IamIC 2012-09-05 20:18:37