当我们提供所有分区键时,允许过滤如何工作?

问题描述 投票:0回答:1

我已经阅读了至少50篇关于此的文章,但仍然不知道答案......我知道如何分区,聚类和允许过滤工作,但无法弄清楚使用所有分区键的ALLOW FILTERING背后的情况在查询中提供。

我有这样一张桌子:

CREATE TABLE IF NOT EXISTS keyspace.events (
  date_string varchar,
  starting_timestamp bigint,
  event_name varchar,
  sport_id varchar
  PRIMARY KEY ((date_string), starting_timestamp, id)
);

这样的查询如何工作?

SELECT * FROM keyspace.events
WHERE
   date_string IN ('', '', '') AND
   starting_timestamp < '' AND
   sport_id = 1 /* not in partitioning nor clustering key */
ALLOW FILTERING;   

“运动是”对先前由正确定义的键检索到的记录进行了过滤吗?在这种查询中,仍然不鼓励允许过滤吗?

在这种特殊情况下我应该如何进行过滤?

提前致谢

cassandra key filtering partition
1个回答
0
投票
  1. 是的,它应首先过滤掉分区,然后才会对非键值进行过滤,并按照此处提到的实验进行过滤:https://dzone.com/articles/apache-cassandra-and-allow-filtering我认为在大多数情况下,在所有键之后使用allow过滤是安全的。
  2. 它将在很大程度上取决于你过滤掉多少数据 - 如果sport_id = 1的最后一个条件是试图过滤掉大部分数据那么这将是一个坏主意,因为它给数据库带来了很大的压力,所以你需要考虑这里的权衡。
  3. 使用带有分区键的IN子句并不是一个好主意 - 特别是上面的查询看起来并不好看,因为它在分区键上使用IN子句和允许过滤。
  4. 建议 - Cassandra非常善于在一秒钟内处理尽可能多的请求,设计理念应该是一次发送更轻量级的查询,而不是尝试发送一个执行大量工作的查询。所以我的建议是在分区密钥上使用=条件触发N调用Cassandra,而不过滤最后一列,然后在代码中组合并执行最终过滤器(您使用的任何语言我认为它可以支持并行发送所有这些调用到数据库)。通过这样做,您可以在数据增长时长期获得性能优势。
© www.soinside.com 2019 - 2024. All rights reserved.