如何正确选择与索引匹配的分区键

qlckcl4x  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(457)

我尝试选择在索引列中至少包含一个具有特定值的行的分区键。
使用当前解决方案,可以满足所有其他要求:
能够根据他们的办公室选择报告。
给定一个办公室,能够选择使用类型和日期范围。
无需根据日期选择报告,无需排放办公室和/或报告类型。
最后,我需要能够选择某个用户创建报告的所有办公室。基于cassadra文档,我在user列上添加了一个索引。
该表定义如下:

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 = ? 但这会导致多行具有相同的office键,这是正确的:每个用户可以在每个office中创建多个报表。
现在我在软件级别过滤重复的办公室,但我问自己,在提取过程中是否可以直接过滤这些数据。
我试过: 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子句是同一个吗?

cczfrluj

cczfrluj1#

cassandra不支持您描述的功能是有原因的,因为它可能效率低下:
首先,正如您所指出的,辅助索引必须列出所有匹配的行键,而不仅仅是不同的匹配分区键。这是因为您可能需要所有的行,而不仅仅是不同的分区键,所以数据必须在那里。必须将这些数据保存在索引中的另一个原因是,每一行都可能被单独删除(或过期),因此cassandra需要跟踪所有行,以确定整个分区是否仍然存在,或者不再存在。
现在,因为我们已经在搜索结果列表中列出了所有行的键,所以只输出“distinct”分区键是一个低效的操作。。。如果在一个分区中有一百万个匹配行,cassandra将需要扫描所有行,然后只输出一个结果。cassandra通常不会让用户用一个低效的操作来攻击自己(例如,看看如何使用“允许过滤”来显式地允许选择查询中的低效过滤)。
也就是说,未来的cassandra版本应该允许您请求的“selectdistinct”请求,可能需要用户说“allowfiltering”来确认它可能很慢。另外,另一种实现可能涉及较慢的更新(每行更新将检查分区的活跃度),但随后是快速读取。“锡拉”曾考虑过这样一个实现,但也没有实现(参见https://github.com/scylladb/scylla/issues/3435).

相关问题