不支持在索引列上进行Select操作,也不支持在PRIMARY KEY上使用IN子句



在Cassandra中,我使用cql:

select msg from log where id in ('A', 'B') and filter1 = 'filter' 

(其中id为分区键,filter1为二级索引,filter1不能用作集群列)

给出响应:

Select on indexed columns and with IN clause for the PRIMARY KEY are not supported

我如何改变CQL来防止这种情况?

您需要将其拆分为单独的查询:

select msg from log where id = 'A' and filter1 = 'filter';

select msg from log where id = 'B' and filter1 = 'filter';

由于Cassandra中数据分区的方式,CQL有很多看似任意的限制(为了阻止低效的查询,也因为它们实现起来很复杂)。

随着时间的推移,我认为这些限制将慢慢被取消,但现在我们必须围绕它们工作。有关限制的详细信息,请参阅深入了解CQL where子句。

另一种选择是,您可以专门为这个查询构建一个表(一个查询表),其中filter1作为分区键,id作为集群键。这样,你的查询工作,你避免了二级索引在一起。

aploetz@cqlsh:stackoverflow> CREATE TABLE log 
    (filter1 text, 
          id text, 
         msg text, 
     PRIMARY KEY (filter1, id));
aploetz@cqlsh:stackoverflow> INSERT INTO log (filter1, id, msg) 
                             VALUES ('filter','A','message A');
aploetz@cqlsh:stackoverflow> INSERT INTO log (filter1, id, msg)
                             VALUES ('filter','B','message B');
aploetz@cqlsh:stackoverflow> INSERT INTO log (filter1, id, msg) 
                             VALUES ('filter','C','message C');
aploetz@cqlsh:stackoverflow> SELECT msg FROM log 
                             WHERE filter1='filter' AND id IN ('A','B');
 msg
-----------
 message A
 message B
(2 rows)

你仍然会使用一个"IN",它也不知道是否能很好地执行。但是您还需要指定一个分区键,因此它的性能可能比预期的要好。