cassandra 无法使用IN()对索引列进行查询

ca1c2owp  于 2023-10-18  发布在  Cassandra
关注(0)|答案(2)|浏览(154)

我有简单的table。它看起来是这样的:

create table trip_stops
(
    cid      uuid,
    stop_id  uuid,
    rate     float,
    date     date,
    primary key ((cid), stop_id)
);
CREATE INDEX ON trip_stops ((cid), date); // local secondary index

然后我做查询如下:

select sum(rate) from trip_stops where
      cid = aa9e4310-e439-423c-86e5-53ddd7c74609
            and date in ('2019-01-01', '2019-01-02');

它失败并请求allow filtering。这个查询的结果不应该是在一个单独的分区中,并且不需要节点间的数据交换吗?先谢了。
我运行查询失败了,希望它能工作

f0brbegy

f0brbegy1#

您为创建索引而发布的定义无效:

CREATE INDEX ON trip_stops ((cid), date)

CREATE INDEX命令只允许索引单个列。正确的语法是:

CREATE INDEX ON table_name (column_name)

在任何情况下,您的查询都会失败,因为本地辅助索引不支持IN()运算符。对于“常规”列(与集合列相对),仅支持相等(=)运算符。
由于您将查询限制到单个分区,因此没有必要对日期列建立索引。您可以简单地使用ALLOW FILTERING运行查询:

SELECT rate FROM trip_stops
  WHERE cid = aa9e4310-e439-423c-86e5-53ddd7c74609
  AND trip_date IN ('2019-01-01', '2019-01-02')
  ALLOW FILTERING

ALLOW FILTERING的唯一推荐用法是当查询限于单个分区时。在分区内的非主列上进行过滤是按照设计工作的,因为协调器不需要扫描整个表(昂贵且低效)--它只需要扫描分区的行。干杯!干杯!

t3irkdon

t3irkdon2#

这看起来像一个ScyllaDB bug,在https://github.com/scylladb/scylladb/issues/13533中跟踪(对于普通的,非本地的,二级索引的类似情况):
不支持“IN”和辅助索引;在Cassandra中,它给出了一个错误(“尚未支持非主键列(x)上的IN predicate ”),而在Scylla中,它是错误地使用慢速过滤完成的(带有一个错误或需要ALLOW FILTERING的警告)。
不幸的是,作为今天的解决方案,您需要将IN请求拆分为多个请求。

相关问题