2016-03-30 75 views
0

假設一個目的如下:卡桑德拉多列排序設計

performance { 
    userid, 
    date, 
    score1, 
    score2, 
    score3, 
    ... 
} 

我想能夠查詢performance小號排序在任一得分字段。我應該爲每個score字段創建不同的表作爲複合鍵嗎?還是有更好的方法來做到這一點?

我很猶豫複製performance對象爲每個score字段,因爲可能有許多score字段。

回答

1

服務表現表,你可以考慮在得分1,得分2得分3上創建二級索引。但是,Cassandra內置的二級索引在具有包含索引值的許多行的列族中效果最佳。因此,您必須平衡您的使用情況,避免使用二級索引來查詢大量記錄以獲取少量結果。 爲了排序,這不是一個好的解決方案。

在最佳實踐中,建議每個查詢模式使用大約一個表。數據重複很好。它還有助於確定最常見的查詢模式並隔離不太常見的查詢模式。一些查詢可能只執行幾千次,而其他查詢可能執行幾十億次。還要考慮哪些查詢對延遲敏感,哪些不是。建議在建模時考慮和平衡兩個高級規則:均勻地在集羣中傳播數據,並儘量減少讀取分區的數量。

另請參閱:Basic Rules of Cassandra Data Modeling

+0

感謝您的回覆。我會研究二級索引解決方案,因爲我不知道它是如何在cassandra中工作的。不過,我希望能夠看到查詢的頻率。 –

+2

像「得分」這樣的高基數事物可能表現不佳,作爲第二指數 –

+0

@ChrisLohfink,我同意你的意見。根據你的評論我編輯了我的答案。謝謝 :) – Rock

1

我有同樣的問題。並解決它我重複表格。這是因爲對我而言,在where子句中,我可以寫where ... and SCORE1 > 0 and SCORE1 < 100。如果您只需要使用相等運算符,則可以嘗試創建索引而不復製表。

如果你需要基於這些三列上的結果,那麼你可以用WITH CLUSTERING WITH ORDER BY (score1 DESC,score2 DESC,score3 DESC);創建表並聲明爲集羣列排序,列要訂購

+0

對不起,也許以前我不明白你的問題,你需要根據這三個列進行排序的結果?因爲如果是的話,那麼你創建了「WITH ORDER BY(score1 DESC,score2 DESC,score3 DESC)」的表格;並聲明爲您要訂購的聚類列列。 –