如果cassandra中存在多个记录,请检入一个查询

时间:2017-10-04 08:44:45

标签: cassandra

我有一个字符串列表“A”,“B”,“C”。

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

我之前使用过两种方法用于关系数据库,但我最近搬到了Cassandra,我不知道如何实现这一点。

问题是我有大约100个字符串,我必须检查,我不想向我的数据库发送100个请求。这不是明智的。

2 个答案:

答案 0 :(得分: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个查询:使用设计良好的表格它们不应该是一个问题,除非你有一个不适当的集群来处理你正在处理的问题。

答案 1 :(得分:-1)

CQL为您提供了使用IN子句的可能性,如:

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

更多信息here

但是这种方法可能不是最好的,因为它可以触发群集中所有节点的选择。

因此,很大程度上取决于数据的结构。

从这个角度来看,运行100个单独的查询可能会更好。