Cassandra Performance SELECT by id或SELECT by nothing

时间:2014-11-24 22:38:14

标签: cassandra cql cql3

我想知道C * s SELECT速度是否取决于我们如何选择整个有限表。

例如我们有这个表

id | value
A  | x
A  | xx
B  | xx
C  | xxx
B  | xx

如果我们愿意,可以更快地获得所有结果 SELECT * FROM Y WHERE id='A'
SELECT * FROM Y WHERE id='B'
SELECT * FROM Y WHERE id='C'

或者如果我们愿意的话会更快 SELECT * FROM Y WHERE 1

或者如果我们愿意,可能会更快 SELECT * FROM Y WHERE id IN ('A', 'B', 'C')

或者他们会同样快(如果我们解除连接时间)

1 个答案:

答案 0 :(得分:2)

不确定您的列族(表)定义是什么样的,但您的样本数据可能永远不会像Cassandra那样存在。主键是唯一的,如果id是您的主键,则最后一次写入将获胜。基本上,您的表格看起来像这样:

id | value
A  | xx
C  | xxx
B  | xx

至于你的个人询问......

SELECT * FROM Y WHERE 1

这可能适用于3行,但是当你有3百万行时,它们不会分布在多个节点上。

SELECT * FROM Y WHERE id IN ('A', 'B', 'C')

这绝对不是更快。 See my answer here至于为什么依赖IN除了偶尔的OLAP便利以外的任何事情都不是一个好主意。

SELECT * FROM Y WHERE id='A'
SELECT * FROM Y WHERE id='B'
SELECT * FROM Y WHERE id='C'

这绝对是最好的方式。 Cassandra旨在通过特定的唯一分区键进行查询。即使您想查询列族(表)中的每一行,您仍然会为其提供特定的分区键。这将有助于您的驱动程序快速确定将查询发送到哪个节点。

现在,假设你有300万行。对于您的应用程序,查询每个单独的应用程序或仅执行SELECT *是否更快?从查询的角度来看,它可能会更快,但您仍然必须遍历每个(客户端)。这意味着在可用的JVM内存的约束下管理它们(这可能意味着在某种程度上对它们进行分页)。但这是一个糟糕的(极端)示例,因为您无法向客户端应用程序发送300万行进行处理。

最重要的是,您必须自己和应用程序的规范内协商这些问题。但就性能而言,我注意到适当的基于查询的数据建模往往超过查询策略或语法技巧。