当我们提供所有分区键时,ALLOW FILTERING如何工作?

时间:2019-02-15 08:32:27

标签: cassandra key filtering partition

我已经阅读了至少50篇文章,但仍然不知道答案... 我知道分区,群集和ALLOW FILTERING的工作原理,但无法弄清楚在查询中提供的所有分区键下使用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;   

对“ sport_id”进行的过滤是否对先前通过正确定义的键检索的记录进行了?这种查询是否仍不鼓励“允许过滤”?

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

预先感谢

1 个答案:

答案 0 :(得分:0)

  1. 是的,它应该首先过滤出分区,然后仅对非键值进行过滤,并按照此处提到的实验进行操作:https://dzone.com/articles/apache-cassandra-and-allow-filtering 我认为在大多数情况下在所有键之后使用允许过滤是安全的。

  2. 这也将很大程度上取决于您要过滤的数据量-如果sport_id = 1的最后一个条件试图过滤掉大部分数据,那么这将是一个坏主意,因为它提供了很多数据库的压力,因此您需要在此处进行权衡。

  3. 使用带有分区键的IN子句不是一个好主意-特别是上面的查询看起来并不好,因为它同时使用了分区键的IN子句和允许过滤。

  4. 建议-Cassandra善于在一秒钟内处理尽可能多的请求,并且设计思想应该是一次发送比尝试发送一个繁琐工作的查询更轻松的查询。所以我的建议是在分区键上对N个调用Cassandra的每个调用都带有=条件,而不过滤最后一列,然后合并并在代码中进行最终过滤(无论您使用哪种语言,我都认为它可以支持并行发送所有这些调用到数据库)。这样,当数据增长时,您将获得长期的性能优势。