索引中的Cassandra子句
假设一个简单的表有一个insert(或者没有这个insert,其实并不重要) 我很难理解为什么我不能用索引z上的in子句进行查询: cqlsh:测试>从测试中选择*其中z位于(3)索引中的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上有一个索
错误请求:主键部分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)
);