我有一个cassandra
表定义如下:
CREATE TABLE test.test(
id text,
time bigint,
tag text,
mstatus boolean,
lonumb int,
PRIMARY KEY (id, time, tag)
)
我想使用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的一部分吗?如何纠正这个?
答案 0 :(得分:3)
您只能在索引列或主键列上使用WHERE
。要纠正您的问题,您需要创建一个索引。
CREATE INDEX iname
ON keyspacename.tablename(columname)
您可以看到更多信息here。
但是你必须记住,这个查询必须针对集群中的所有节点运行。
或者,如果lonumb
是您最常查询的内容,则可以重新考虑您的表格结构。
答案 1 :(得分:2)
Jny是正确的,WHERE
仅对PRIMARY KEY中的列有效,或者为其创建了二级索引。解决此问题的一种方法是为lonumb
查询创建特定的查询表。
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;
它将返回lonumb
= 4231的所有CQL行,按time
排序。我将id
放在PRIMARY KEY上以确保唯一性。
select * from test where mstatus = true;
这个比较棘手。低基数列(如布尔值)上的索引和键通常被认为是一个坏主意。看看是否有另一种方式可以对其进行建模。否则,您可以在mstatus
上尝试使用辅助索引,但只能在指定分区键(在本例中为lonumb
)时使用它,如下所示:
select * from testbylonumb where lonumb = 4231 AND mstatus = true;
也许这样做不会太糟糕,因为你将它限制在一个特定的分区。但我绝对不会在SELECT *
mstatus
上做{{1}}。