索引中的Cassandra子句

索引中的Cassandra子句,cassandra,cql,cql3,database,nosql,Cassandra,Cql,Cql3,Database,Nosql,假设一个简单的表有一个insert(或者没有这个insert,其实并不重要) 我很难理解为什么我不能用索引z上的in子句进行查询: cqlsh:测试>从测试中选择*其中z位于(3) 错误请求:主键部分z不能被限制(前面的部分y不是被限制就是被非EQ关系限制) 可以使用简单的equals谓词: cqlsh:test> select * from test where z = 3; x | y | z ---+---+--- 1 | 2 | 3 (0 rows) 我认为在z上有一个索

假设一个简单的表有一个insert(或者没有这个insert,其实并不重要)

我很难理解为什么我不能用索引z上的in子句进行查询:

cqlsh:测试>从测试中选择*其中z位于(3)
错误请求:主键部分z不能被限制(前面的部分y不是被限制就是被非EQ关系限制)

可以使用简单的equals谓词:

cqlsh:test> select * from test where z = 3;

 x | y | z
---+---+---
 1 | 2 | 3

(0 rows)
我认为在z上有一个索引可以保持从z的特定值到行的映射,但这个假设似乎是错误的

为什么这不符合我的预期?我猜索引的工作方式不同


编辑:我正在使用[cqlsh 4.1.1 | Cassandra 2.0.6 | CQL spec 3.1.1 |节俭协议19.39.0]

虽然DataStax的文档通常非常好,但我找不到任何讨论这背后细节的内容。然而,我确实看到了这篇文章,叫做。第二节标题为“SELECT语句的WHERE子句限制””有几段讨论了
中的

换言之,它基本上是这样说的:

对于单列键,允许使用IN运算符而不受限制。对于复合主键,我必须在分区键的前N-1列上使用=运算符,以便在最后一列上使用in运算符

在您的情况下,
x
是您的分区键,这意味着
x
是唯一支持CQL中的
操作符的列。如果您确实需要能够在
z
列上的
查询中支持
,那么您必须对数据进行反规范化,并构建一个(冗余)表来支持该查询。例如:

CREATE TABLE test (
 x int,
 y int,
 z int,
 PRIMARY KEY (z)
);
…将支持查询,但
z
的值可能不是唯一的。在这种情况下,您可以将
x
和/或
y
定义为
列表
,这样就可以了

此外,DataStax上确实有可用的文档,并且它们声明相同的条件适用于使用
中的

在大多数情况下,不允许在WHERE子句中使用IN 推荐。在中使用会降低性能,因为通常 必须查询节点。例如,在单个本地数据中心中 具有30个节点、3个复制因子和一致性的群集 在本地仲裁级别,一个单键查询发送到两个节点,但是 如果查询使用IN条件,则为被查询的节点数 很可能更高,最多20个节点,具体取决于 密钥属于令牌范围


我会调整为“主键中的最后一列支持in操作符。”-刚刚使用in作为最后一个集群键对其进行了测试。不working@Scaramouche更新了包含相同信息的新帖子的链接。
CREATE TABLE test (
 x int,
 y int,
 z int,
 PRIMARY KEY (z)
);