0

我以前问过这个问题,并且从包括文档在内的各种来源收到了明显相互矛盾的答案。因此,我通过文档链接和 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 正在过滤列名,即值。我没有过滤最终的“值”,因此不需要二级索引。

本文档说明以下内容:

WHERE 子句可以包括对除第一列之外的列的大于和小于比较。只要所有先前的关键组件列都已经用严格 = 比较标识,最后一个给定的关键组件列可以是任何类型的比较。

根据这一点,上述查询可以正常工作,@jbellis 确认了这一点,但其他人因为 PK 安排而拒绝。

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

  1. 您可以 <=> 查询所有非 PK 列。
  2. 如果您有一个复合键,并且除最后一个之外的每个组件都有一个 =,则可以 <=> 查询最后一个组件。

但是,根据以下内容,不能对不属于 PK 的列应用 WHERE 子句(请参见此处)。

在没有索引的情况下执行 CONTAINS 的问题在于,这通常是非常低效的,并且禁止这种通常低效的查询是我们希望使用 Cassandra/CQL 的事情(很像我们不允许 'WHERE a = 3' 的事实,除非a 是 PK 的一部分或已编入索引)。

根据这一点,我们可以仅将 WHERE 谓词应用于 PK 组件。这意味着我的查询不起作用。

我错过了什么?

4

0 回答 0