2017-10-04 62 views
1

我有一個字符串「A」,「B」,「C」的列表。如果在cassandra中存在多條記錄,請檢查一個查詢

我想知道如何檢查所有這些字符串是否存在於Cassandra列中。

我有兩種方法我以前用於關係數據庫,但我最近搬到了卡桑德拉,我不知道如何實現這一點。

問題是我有大約100個字符串,我必須檢查,我不想發送100個請求到我的數據庫。這不是明智的。

回答

1

有趣的問題......我不知道你正在使用的模式,但是如果你的字符串在唯一的PK列(或在查詢時已知其他列值的複合PK),那麼你大概可以發出100個查詢而不用擔心。密鑰緩存將幫助您不會碰到磁盤,因此您可以獲得快速響應。相反,如果您打算將這個列用於不屬於任何PK的列,那麼除非您執行某種技巧,否則您將很難弄清楚這一點,並且這些都受到一些性能限制和/或無論如何增加了代碼複雜度。

作爲一個例子,你可以用上面描述的目的建立一個「頻率」表,在這裏存儲你「看見」每個字符串「A」,「B」等等的次數,然後查詢這個表格當您需要檢索的信息:

SELECT frequencies FROM freq_table WHERE pk = IN ('A', 'B', 'C'); 

,那麼你仍然需要循環結果集,檢查每個記錄> 0另一種可能是發出真正的查詢前SELECT COUNT(*),因爲你知道提前獲得多少條記錄(例如我的例子中有3條),但是具有正確數量的檢索記錄可能就足夠了(例如,一個計數器爲零)。

當然,你需要保持對每個插入/更新此表/你的主表中刪除,提高了解決方案的複雜性,當然,所有的IN條款和COUNT相關的警告適用於...

我可能會堅持100個查詢:有一個設計良好的表格,他們不應該是一個問題,除非你有問題的大小,你正在處理的羣集不足。

+0

在一個真實的場景中,我可能需要大約1.000次訪問數據庫。這對卡桑德拉來說成本高嗎?它將如何處理這個問題? – tzortzik

+1

@tzortzik那麼它取決於你的集羣的大小和每個節點的大小......鍵緩存對於這類工作將有很大的幫助,但有時候這還不夠。你確定Cassandra是這個工作的正確工具嗎?如何使用像Redis這樣的專用緩存? – xmas79

-1

CQL給予您使用IN子句像的可能性:

SELECT first_name, last_name FROM emp WHERE empID IN (105, 107, 104); 

更多信息here

但是這種方法可能不是最好的,因爲它可以觸發集羣中所有節點上的select。

所以非常依賴於你的數據結構。

從這個角度來看,運行100個單獨的查詢可能會更好。

+0

這不起作用,因爲它不檢查表中是否全部插入105,107,104。 – tzortzik

相關問題