【问题标题】:How to properly select partition keys that match an index如何正确选择与索引匹配的分区键
【发布时间】:2019-06-04 03:25:52
【问题描述】:

我尝试在索引列中选择包含至少一行具有特定值的分区键。

使用当前解决方案可以满足所有其他要求:

  • 能够根据办公室选择报告。
  • 给定办公室,可以使用类型和日期范围进行选择。
  • 无需根据日期选择报告,无需排放办公室和/或报告类型。

最后,我需要能够选择某个用户已创建报告的所有办公室。根据 cassadra 文档,我在用户列上添加了一个索引。

表定义为:

create table report(
    office uuid,
    type text,
    insert_date timestamp,
    ...
    created_by uuid,
    ...
    primary key(office, type, insert_date));
create index created_by_idx on report (created_by);

如果我没记错的话,使用该索引就像有一个如下描述的辅助表:

create table report2(
    created_by uuid,
    office uuid,
    type text,
    insert_date timestamp,
    ...
    primary key(created_by ,office, type, insert_date));

我可以成功运行如下查询: select office from report where created_by = ? 但这会导致多行具有相同的办公室密钥,这是正确的:每个用户可以在每个办公室创建多个报告。

现在我在软件级别过滤重复的办公室,但我问自己是否可以在提取过程中直接过滤这些数据。

我试过了: select distinct office from report where created_by = ? 这导致 SELECT DISTINCT with WHERE clause only supports restriction by partition key and/or static columns.

然后我尝试: select office from report where created_by = ? group by office 这给了我正确的结果,但发出警告: Aggregation query used without partition key

这可能是个问题吗?如何处理 cassandra 这样的查询,在这种情况下可以忽略此警告吗?最后,真的是一个更好的选择,使用这样的查询来对抗 select * ... 有相同的 where 子句吗?

【问题讨论】:

    标签: cassandra cql cql3


    【解决方案1】:

    Cassandra 不支持您描述的功能是有原因的——因为它可能效率低下:

    首先,二级索引必须确实列出所有匹配的行键,而不仅仅是不同的匹配分区键。这是因为您可能会要求所有行,而不仅仅是不同的分区键,所以数据必须在那里。必须将这些数据保存在索引中的另一个原因是每个单独的行都可能被单独删除(或过期),因此 Cassandra 需要跟踪所有这些数据以确定整个分区是否仍然存在或不再存在。

    现在,由于我们已经在搜索结果列表中列出了所有行的键,因此仅输出“不同”分区键是一种低效的操作...如果您在一个分区中有一百万个匹配行,Cassandra 将需要在只输出一个结果之前扫描所有这些。 Cassandra 通常不会让用户以低效的操作击中自己的脚(例如,看看如何需要“ALLOW FILTERING”来明确允许在 SELECT 查询中进行低效过滤)。

    话虽如此,未来的 Cassandra 版本应该允许您请求的“SELECT DISTINCT”请求是有道理的,也许要求用户说“ALLOW FILTERING”以确认它可能很慢。此外,另一种实现可能涉及较慢的更新(每行更新都会检查分区的活跃度),然后是快速读取。 Scylla 考虑过这样的实现,但也没有实现(参见https://github.com/scylladb/scylla/issues/3435)。

    【讨论】:

      猜你喜欢
      • 2023-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      相关资源
      最近更新 更多