2014-12-03 65 views
7

在卡桑德拉,我可以創建一個複合分區鍵,從我的聚集鍵單獨查詢卡桑德拉:通過部分分區鍵

CREATE TABLE footable (
    column1 text, 
    column2 text, 
    column3 text, 
    column4 text, 
    PRIMARY KEY ((column1, column2)) 
) 

據我所知,quering由分區鍵是一個非常有效的(最高效?)的方法來檢索數據。但是,我不知道的是,僅查詢複合分區鍵的一部分是否也是有效的。

在MSSQL中,只要組件包含在第一個(本例中爲column1而不是column2)開頭,就會有效。卡桑德拉的情況也是這樣嗎?查詢僅基於column1的行是否高效?

+1

如果您只想查詢主鍵的一部分,可以將其定義爲PRIMARY KEY(column1,column2)。但是,這意味着分區(數據存儲的位置)僅由column1確定。這可能會導致熱節點或其他問題,具體取決於column1的基數。如果你提供了關於你的模式的更多細節(特別是column1和column2代表什麼),我們可能會爲你提供一個有效的中間立場。 – mildewey 2014-12-03 19:23:55

+1

我在這裏尋找更多的一般策略,而不是特別的建議。然而,我的實際問題並不是我最終會出現熱點,而是因爲我也在使用羣集密鑰(時間戳),所以在某些時候我可能會超過20億列的限制。 – Mark 2014-12-03 20:29:04

+1

@mildewey也是非常清楚的,我在詢問基於部分*分區*鍵的查詢,而不是* primary *鍵的一部分。某種程度上,可以在分區鍵的最後部分使用IN子句。這對我的用例來說已經足夠了。 – Mark 2014-12-03 20:31:12

回答

11

卡桑德拉並非如此,因爲這是不可能的。這樣做將產生以下錯誤:

​​

看看這個卡桑德拉2014從DataStax MVP羅比·斯特里克蘭SF峯會演講題爲「CQL Under the Hood」。幻燈片62-64顯示完整的分區鍵用作rowkey。使用Cassandra中的複合分區鍵時,您必須使用所有rowkey查詢或不查詢。

你可以看complete presentation video here

4

這在Cassandra中是不可能的,因爲它需要全表掃描來解決這樣的查詢。分區的位置由組合鍵的所有成員的散列定義,這意味着只給出鍵的一半和不分配它一樣好。查找記錄的唯一方法是搜索所有密鑰並檢查它們是否匹配。

+3

「只給出一半的關鍵就像沒有給它」 - 很好地放! – Aaron 2014-12-03 17:05:15