我已经问了这个问题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,因此本质上不重要。我把它解释为:
但是,根据以下内容,不能对不属于PK的列(see here)应用WHERE子句。
执行没有索引的CONTAINS的问题是这样的 一般来说效率非常低,并且禁止这种效率通常很低 查询是我们想要的Cassandra / CQL(很像事实 我们不允许'WHERE a = 3',除非a是PK的一部分或者是 索引)。
为此,我们只能将WHERE谓词应用于PK组件。这意味着我的查询无效。
我错过了什么?