Cassandra不支持在索引列上进行SELECT操作并使用IN子句作为主键。

5
在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以避免这种情况发生?

2个回答

4

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

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

并且

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

由于Cassandra中数据分区的方式,CQL有许多看似随意的限制(旨在防止低效查询和因为它们很难实现)。

随着时间的推移,我认为这些限制将逐渐被删除,但现在我们必须绕过它们。有关这些限制的更多详细信息,请参见深入了解CQL where子句


2

另一个选择是,您可以构建一个专门用于此查询的表(查询表),其中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”语句,这也不是一个性能良好的选项。但是,你同时指定了分区键,因此它可能比预期的表现更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接