[英]Clustering by time in Cassandra - CQL3
我對寬行,聚類,手動索引等有疑問。我希望有人可以在這里提供幫助。 CQL版本是3,Cassandra是2.0.1;
假設我有CF“產品”
id timeuuid
location varchar
shopname varchar
expiry timestamp
count int
PRIMARY KEY (id)
我希望能夠按到期日在特定位置選擇產品。 因此創建注冊如下:
CF 'id_register_by_loc_expy'
location varchar
expiry timestamp
id timeuuid
PRIMARY KEY (location,expiry,id)
並希望按到期日選擇特定商店名稱的產品。 然后創建:
CF 'id_register_by_shopname_expy'
shopname vachar
expiry timestamp
id timeuuid
PRIMARY KEY (shopname,expiry,id)
這樣一來,我可以按以下方式進行有效的查詢/切片:
1.從id_reg_by_loc_expy中選擇id,其中location ='x'; // [自然按照到期日排序]
2.從id_reg_by_loc_expy中選擇id,其中location ='x'且到期時間>'t1'和到期時間<'t2';
3.從id ='id'的產品中選擇*;
和;
4.從id_reg_by_shop_exp中選擇id,其中shopname ='y'; // [自然按照到期日排序]
和;
5.從id_reg_by_shop_count中選擇id,其中shopname ='y'; // [按計數自然排序]
等等..
如果需要更改聚簇鍵並且我需要對寄存器中這些特定行上的條目重新排序,該怎么辦?
我遇到的問題是:
重新插入新的有效期(或計數)會導致新的主鍵,因此不會更新我的舊條目。
我不能“更新.. set expiry ='x2'where ...”,因為到期是主鍵的一部分。
由於邏輯刪除的限制,用新的主鍵插入然后刪除舊的主鍵是一個不好的選擇。
我嘗試過的事情是:
CF'id_reg_by_loc_expy'
location varchar expiry timestamp id timeuuid otherSecondaryIndex varchar PRIMARY KEY (location,id)
但;
一種。 這沒有利用Cassandra的存儲排序功能。 我希望每一行都有很多產品,並且希望避免搜索整行。 和
灣 事實證明,無論如何我實際上無法執行以下查詢:
(i)通過dtg asc從id_reg _...中選擇id,其中location =“ x”;
錯誤的請求:不支持帶有第二索引的ORDER BY。
Or
(ii)從id_reg _...中選擇id,其中location ='x'並且到期時間>'t1'和到期時間<'t2';
錯誤的請求:使用等於運算符的by-columns子句中沒有索引列
盡管我可以做到這一點:
(iii)從id_reg _...中選擇id,其中location ='x'和otherSecIndex ='y',並且到期時間>'t1'和到期時間<'t2';
**請注意,這要求我強制執行“允許過濾”,並且似乎設計較差,只是為了允許此查詢而包含另一個二級索引。也就是說,與“ order by”查詢相比,我對它的興趣較小。
2.使用timeuuid代替時間戳記的到期時間。 即使這種方法無法解決,也無濟於事。
我在這里缺少基本的東西嗎? 是我需要采用所有墓碑緩解技術的答案嗎? 還是我的應用程序中的某些訂購?
蒂姆,干杯
沒有將sorted列作為主鍵的一部分,就無法進行排序。 Cassandra不會在查詢時進行排序。
您是否希望每個product_id多次更改到期戳? 如果不是這樣,那么墓碑就不會成為一個大問題,尤其是當您的行確實與您描述的行一樣小時。 您可以調整相關設置,例如gc_grace_seconds
(邏輯刪除掛了多久),以確保它們符合您的操作需求和容量。
如果您打算非常頻繁地更新到期時間,那么我的第一個直覺是,如果不進行一些測量和手動調整以達到穩定的配置,就很難輕易處理這種模式。 如果您開始被墓碑淹沒,則可能必須訴諸重大壓實時間表才能有效地去除積聚的墓碑。
最重要的是,在Cassandra中以可伸縮方式實現具有類似隊列語義的任何存儲模式都是不平凡的。 至少那是我的直覺。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.