【问题标题】:cassandra Select on indexed columns and with IN clause for the PRIMARY KEY are not supported不支持索引列上的 cassandra 选择和 PRIMARY KEY 的 IN 子句
【发布时间】:2015-09-14 06:57:35
【问题描述】:

在 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 以防止这种情况发生?

【问题讨论】:

    标签: cassandra cql cql3


    【解决方案1】:

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

    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

    【讨论】:

      【解决方案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”,它也不知道性能是否良好。但是你也需要指定一个分区键,所以它的性能可能比预期的要好。

      【讨论】:

        猜你喜欢
        • 2014-07-15
        • 1970-01-01
        • 2016-07-07
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 2020-10-19
        相关资源
        最近更新 更多