过滤Cassandra 1.1中的列 - 重复&澄清

时间:2012-09-08 16:17:42

标签: database cassandra primary-key filtering

我已经问了这个问题before,并且从各种来源收到了明显相互矛盾的答案,包括文档。所以我正在重复它的文档链接和Datastax的一些人所说的,希望Cassandra的开发人员(或具有真正Cassandra 1.1经验的人)可以为我清除这一点。

我希望运行如下查询,其中ID是PK,Data是最终的“值”:

SELECT Data FROM MyApp.ProductFamilies WHERE ID IN (?, ?, ?) AND PriceLow >= ? 
AND PriceHigh <= ? AND MassLow >= ? AND MassHigh <= ? and MnfGeo >= ? AND 
MnfGeo <= ?

请注意,在底层,CQL正在过滤列名,即列值。我没有过滤最终的“价值”,因此不需要二级索引。

This documentation声明如下:

  

WHERE子句可以包括大于和小于比较   除第一列以外的列。只要以前所有的关键组件   列已经使用strict = comparisons进行了识别   最后给出的关键组件列可以是任何类型的比较。

按照这个,上面的查询可以正常工作,@ jbellis证实了这一点,但是其他人因为PK安排而拒绝。

声明有点模糊,因为第1列可能是也可能不是完整的PK,因此本质上不重要。我把它解释为:

  1. 你可以&lt; =&gt;查询所有非PK列。
  2. 如果您有一个复合键,并且除最后一个组件外,每个组件都有一个=,则可以&lt; =&gt;查询最后一个组件。
  3. 但是,根据以下内容,不能对不属于PK的列(see here)应用WHERE子句。

      

    执行没有索引的CONTAINS的问题是这样的   一般来说效率非常低,并且禁止这种效率通常很低   查询是我们想要的Cassandra / CQL(很像事实   我们不允许'WHERE a = 3',除非a是PK的一部分或者是   索引)。

    为此,我们只能将WHERE谓词应用于PK组件。这意味着我的查询无效。

    我错过了什么?

0 个答案:

没有答案