不支持索引列上的 cassandra Select 和 PRIMARY KEY 的 IN 子句
cassandra Select on indexed columns and with IN clause for the PRIMARY KEY are not supported
在 Cassandra 中,我使用的是 cql:
select msg from log where id in ('A', 'B') and filter1 = 'filter'
(其中id
为分区键,filter1
为二级索引,filter1
不能作为聚簇列)
这给出了响应:
Select on indexed columns and with IN clause for the PRIMARY KEY are not supported
如何更改 CQL 以防止出现这种情况?
您需要将其拆分为单独的查询:
select msg from log where id = 'A' and filter1 = 'filter';
和
select msg from log where id = 'B' and filter1 = 'filter';
由于数据在 Cassandra 中的分区方式,CQL 有很多看似任意的限制(以阻止低效查询,也因为它们实现起来很复杂)。
随着时间的推移,我认为这些限制会慢慢取消,但现在我们必须解决这些问题。有关限制的更多详细信息,请参阅 A deep look at the CQL where clause.
另一种选择是,您可以专门为此查询(查询 table)构建一个 table,其中 filter1
作为分区键,id
作为分区键聚类键。这样,您的查询就可以工作,并且您可以避免一起使用二级索引。
aploetz@cqlsh:Whosebug> CREATE TABLE log
(filter1 text,
id text,
msg text,
PRIMARY KEY (filter1, id));
aploetz@cqlsh:Whosebug> INSERT INTO log (filter1, id, msg)
VALUES ('filter','A','message A');
aploetz@cqlsh:Whosebug> INSERT INTO log (filter1, id, msg)
VALUES ('filter','B','message B');
aploetz@cqlsh:Whosebug> INSERT INTO log (filter1, id, msg)
VALUES ('filter','C','message C');
aploetz@cqlsh:Whosebug> SELECT msg FROM log
WHERE filter1='filter' AND id IN ('A','B');
msg
-----------
message A
message B
(2 rows)
您仍然会使用 "IN",但其性能也不是很好。但您还需要指定一个分区键,因此它的性能可能比预期的要好。
在 Cassandra 中,我使用的是 cql:
select msg from log where id in ('A', 'B') and filter1 = 'filter'
(其中id
为分区键,filter1
为二级索引,filter1
不能作为聚簇列)
这给出了响应:
Select on indexed columns and with IN clause for the PRIMARY KEY are not supported
如何更改 CQL 以防止出现这种情况?
您需要将其拆分为单独的查询:
select msg from log where id = 'A' and filter1 = 'filter';
和
select msg from log where id = 'B' and filter1 = 'filter';
由于数据在 Cassandra 中的分区方式,CQL 有很多看似任意的限制(以阻止低效查询,也因为它们实现起来很复杂)。
随着时间的推移,我认为这些限制会慢慢取消,但现在我们必须解决这些问题。有关限制的更多详细信息,请参阅 A deep look at the CQL where clause.
另一种选择是,您可以专门为此查询(查询 table)构建一个 table,其中 filter1
作为分区键,id
作为分区键聚类键。这样,您的查询就可以工作,并且您可以避免一起使用二级索引。
aploetz@cqlsh:Whosebug> CREATE TABLE log
(filter1 text,
id text,
msg text,
PRIMARY KEY (filter1, id));
aploetz@cqlsh:Whosebug> INSERT INTO log (filter1, id, msg)
VALUES ('filter','A','message A');
aploetz@cqlsh:Whosebug> INSERT INTO log (filter1, id, msg)
VALUES ('filter','B','message B');
aploetz@cqlsh:Whosebug> INSERT INTO log (filter1, id, msg)
VALUES ('filter','C','message C');
aploetz@cqlsh:Whosebug> SELECT msg FROM log
WHERE filter1='filter' AND id IN ('A','B');
msg
-----------
message A
message B
(2 rows)
您仍然会使用 "IN",但其性能也不是很好。但您还需要指定一个分区键,因此它的性能可能比预期的要好。