首页 文章

cassandra在索引列上选择,并且不支持PRIMARY KEY的IN子句

提问于
浏览
4

在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 回答

  • 2

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

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

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

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

    随着时间的推移,我认为这些限制将慢慢消除,但现在我们必须解决它们 . 有关限制的更多详细信息,请参阅A deep look at the CQL where clause .

  • 3

    另一个选择是,您可以专门为此查询(查询表)构建一个表,其中 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”,这个“IN”也不是很好 . 但是您也会指定一个分区键,因此它的性能可能比预期的要好 .

相关问题