我在围绕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由于担心不可预测的性能,拒绝执行查询。
答案 0 :(得分:2)
我认为它们本质上是相同的,尽管我从未遇到过“允许过滤”命令。我很惊讶你可以实际运行该cql,而无需指定密钥。它不应该是这样的:
select value from eventindex WHERE key = '<key>'
AND column1 > 1234567890 AND column1 <= 1234567895
我发现这篇文章对于理解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