复合键上的CQL2列切片和CQL3是否等效?

时间:2013-03-07 11:18:15

标签: cassandra cql cql3

我在围绕CQL解决了一些问题。我一直在尝试使用CQL3中的列切片(我认为这是正确的术语),但所有关于它的文档似乎都引用了CQL2。

例如,我有下表:

CREATE TABLE eventindex (
  key uuid,
  column1 int,
  value uuid,
  PRIMARY KEY (key, column1)
) WITH COMPACT STORAGE

现在,在CQL2中,我可以执行以下操作:

select '1234567890'..'1234567895' from eventindex;

返回所有行范围内的所有列

现在,在CQL3中我不能这样做(至少,不能在cqlsh上),但我能做到:

select value from eventindex WHERE column1 > 1234567890 AND column1 <= 1234567895 allow filtering;

这让我的信息基本相同,但格式略有不同。

问题是 - 这些是等价的吗?如果我不添加允许过滤,cqlsh警告我有关性能问题的事实告诉我,CQL2版本更高效,而且我的CQL3查询运行方式不同,但我真的无法找到直接答案确认我的直觉在这里。

编辑:让我担心的具体问题是运行CQL2查询不会引起cqlsh的抱怨,但运行CQL3查询而不用“允许过滤”会使cqlsh由于担心不可预测的性能,拒绝执行查询。

2 个答案:

答案 0 :(得分:2)

我认为它们本质上是相同的,尽管我从未遇到过“允许过滤”命令。我很惊讶你可以实际运行该cql,而无需指定密钥。它不应该是这样的:

select value from eventindex WHERE key = '<key>' 
AND column1 > 1234567890 AND column1 <= 1234567895

我发现这篇文章对于理解CQL3在幕后的工作非常有用:

http://www.datastax.com/dev/blog/thrift-to-cql3

答案 1 :(得分:1)

允许过滤命令存在,因为您的查询可能会导致大量(或至少未确定)的数据被读取而不会在您的查询中使用。

select value from eventindex WHERE column1 > 1234567890 AND column1 <= 1234567895;

此查询需要读取每一行 - 因为无法查看特定行是否在该范围内具有column1值而不查看该行。然后过滤掉不满足WHERE谓词的行。

考虑到大型数据存储中可能存在多少行,默认情况下这是不可理解的。但是,在某些情况下,您可能对您的数据有足够的了解,并说“这是合理的,我想这样做”。在这种情况下,您可以使用ALLOW FILTERING来允许它。

当你使用一个指定分区键值的谓词(例如WHERE key = .....)时,你就不会得到这条消息,因为只有满足谓词这一部分的行才需要看看。

有关详细信息,请参阅以下内容: http://cassandra.apache.org/doc/cql3/CQL.html#selectStmt