我想知道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')
或者他们会同样快(如果我们解除连接时间)
答案 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万行进行处理。
最重要的是,您必须自己和应用程序的规范内协商这些问题。但就性能而言,我注意到适当的基于查询的数据建模往往超过查询策略或语法技巧。