这里的主要问题是您试图在复合分区键IN
的两个部分上使用关系。 只能对分区或集群键的最后一部分进行操作。IN
为了让您的查询正常工作,您的 PRIMARY KEY 需要在GROUPNAME
和上进行分区CLASS
,同时在 上进行集群YEAROFJOINING
:
PRIMARY KEY ((groupname, class), yearofjoining))
当我使用该 PRIMARY KEY 查询您的表时,使用您的原始查询:
aploetz@cqlsh:stackoverflow> SELECT * FROM CONFIGURATION
WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL')
AND YEAROFJOINING IN (2014,2015);
groupname | class | yearofjoining | value
-----------+-------+---------------+-------
332 | APL | 2014 | test1
332 | APL | 2015 | test3
332 | BPL | 2014 | test2
(3 rows)
额外的想法:
我不知道您可以IN
在同一查询中对分区的最后部分和集群键使用关系。所以我今天学到了一些东西!
我不得不警告您,IN
已知在您的分区键上使用的性能不佳(Cassandra 中的 IN 关系是否不利于查询?)。事实上,多行键查询已被确定为 Cassandra 反模式。
我越想这个,我越认为如果你对YEAROFJOINING
(而不是IN
)进行切片查询,你会获得更好的性能。因此,如果您要搜索的年份是有序的,比如 2014 年及更高版本,则更好的查询将像这样工作:
aploetz@cqlsh:stackoverflow> SELECT * FROM CONFIGURATION
WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL')
AND YEAROFJOINING >= 2014;
由于集群键 on YEAROFJOINING
,这将更快,这将利用您的磁盘排序顺序。