2017-10-04 65 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

相关问题