gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:17:27 25 4
gpt4 key购买 nike

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

使用当前的解决方案,所有其他要求都得到满足:

  • 能够根据办公室选择报告。
  • 给定一个办公室,能够选择使用类型和日期范围。
  • 无需根据没有排放办公室和/或报告类型的日期选择报告。

最后,我需要能够选择特定用户创建报告的所有办公室。根据 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));

我可以成功运行如下查询:从报告中选择办公室,其中 created_by = ?但这会导致多行具有相同的办公室 key ,这是正确的:每个用户可以在每个办公室创建多个报告。

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

我试过:从报告中选择不同的办公室 where created_by = ?结果是带有 WHERE 子句的 SELECT DISTINCT 仅支持分区键和/或静态列的限制。

然后我试了:从报告中选择 office where created_by = ?按办公室分组给我正确的结果,但发出警告:在没有分区键的情况下使用聚合查询

这会不会是个问题?如何处理 cassandra 这样的查询,在这种情况下,是否可以忽略此警告?最后,使用这样的查询来对抗select * ... 使用相同的 where 子句?

最佳答案

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

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

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

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

关于cassandra - 如何正确选择与索引匹配的分区键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54108695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com