使用 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 *
我有一个 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 *