我的表架構爲:
A)卡桑德拉 - 二級索引和查詢性能
CREATE TABLE friend_list (
userId uuid,
friendId uuid,
accepted boolean,
ts_accepted timestamp,
PRIMARY KEY ((userId ,accepted), ts_accepted)
) with clustering order by (ts_accepted desc);
在這裏,我能像執行查詢:
1. SELECT * FROM friend_list WHERE userId="---" AND accepted=true;
2. SELECT * FROM friend_list WHERE userId="---" AND accepted=false;
3. SELECT * FROM friend_list WHERE userId="---" AND accepted IN (true,false);
但第三查詢涉及更多閱讀,所以我試圖改變這樣的架構:
B)
CREATE TABLE friend_list (
userId uuid,
friendId uuid,
accepted boolean,
ts_accepted timestamp,
PRIMARY KEY (userId , ts_accepted)
) with clustering order by (ts_accepted desc);
CREATE INDEX ON friend_list (accepted);
有了這個B型模式,第1和第2的查詢工作,但我可以簡化第三個查詢爲:
3. SELECT * FROM friend_list WHERE userId="---";
我認爲,第二個架構給出了第三個查詢更好的性能,因爲它不會對每一行進行條件檢查。
卡桑德拉專家......請建議我這是在實現this.A或B.
所以你建議有兩個表,首先是我的模式A查詢1和2,第二個表我的模式B查詢3。但爲什麼我不能只用模式B作爲所有3個查詢作爲主要被接受的密鑰不是必需的。 –
此外,如果我使用PRIMARY KEY((userId),接受,ts_accepted),我不能排序ts_accepted集羣列順序,因爲我必須排序'accepted'和'ts_accepted'。每次不必要地排序'接受'會帶來性能問題。 –
您的第一個模式似乎表明您需要主鍵中的'accepted'字段。如果你不那麼爲你的特定用例,我認爲是索引列是好的(低基數,罕見的變化),但它仍然比'接受'作爲一個聚類列慢。雖然對於你的情況,差異應該是最小的。 – sam