使用 select 和 cql 中的 where 时出现 cassandra 错误

cassandra error when using select and where in cql

我有一个 cassandra table 定义如下:

CREATE TABLE test.test(
id text,
time bigint,
tag text,
mstatus boolean,
lonumb  int,
PRIMARY KEY (id, time, tag)
)

我想 select 一栏使用 select。 我试过了:

select * from test where lonumb = 4231;    

它给出:

code=2200 [Invalid query] message="No indexed columns present in by-columns clause with Equal operator"

我也做不到

select * from test where mstatus = true;

cassandra 不支持 where 作为 CQL 的一部分吗?如何纠正?

您只能在索引列或主键列上使用 WHERE。要更正您的问题,您需要创建一个索引。

CREATE INDEX iname 
ON keyspacename.tablename(columname)

您可以查看更多信息here

但您必须记住,此查询必须 运行 对集群中的所有节点。

或者,如果 lonumb 是您最常查询的内容,您可能会重新考虑您的 table 结构。

Jny 是正确的,因为 WHERE 仅对 PRIMARY KEY 中的列有效,或者已为其创建二级索引的列。解决此问题的一种方法是为 lonumb 个查询创建特定查询 table。

CREATE TABLE test.testbylonumb(
  id text,
  time bigint,
  tag text,
  mstatus boolean,
  lonumb  int,
  PRIMARY KEY (lonumb, time, id)
)

现在,此查询将起作用:

select * from testbylonumb where lonumb = 4231; 

它将 return 所有 lonumb = 4231 的 CQL 行,按 time 排序。我把 id 放在 PRIMARY KEY 上以确保唯一性。

select * from test where mstatus = true;

这个比较棘手。低基数列(如布尔值)上的索引和键通常被认为是一个坏主意。看看是否有其他方法可以对其进行建模。否则,您可以在 mstatus 上试验二级索引,但仅在指定分区键(本例中为 lonumb)时使用它,如下所示:

select * from testbylonumb where lonumb = 4231 AND mstatus = true;

也许这不会表现得太差,因为您将其限制在特定分区。但我绝对不会在 mstatus.

上做 SELECT *