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

How does ALLOW FILTERING work when we provide all of the partition keys?

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

我有一个 table 这样的:

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. 是的,它应该先过滤掉分区,然后只对非键值进行过滤,按照这里提到的实验:https://dzone.com/articles/apache-cassandra-and-allow-filtering 我认为在大多数情况下,在所有密钥之后使用允许过滤是安全的。

  2. 这在很大程度上也取决于您要过滤掉多少数据 - 如果 sport_id = 1 的最后一个条件试图过滤掉大部分数据,那么它将是一个坏主意,因为它给数据库带来了很大的压力,所以你需要在这里考虑权衡。

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

  4. 建议 - Cassandra 非常擅长在一秒钟内处理尽可能多的请求,设计思想应该是一次发送更轻量级的查询,而不是尝试发送一个执行大量请求的查询工作。所以我的建议是在不过滤最后一列的情况下,在分区键上使用 = 条件触发对 Cassandra 的 N 次调用,然后组合并在代码中进行最终过滤(无论你使用哪种语言,我假设它都可以支持并行发送所有这些调用到数据库)。通过这样做,您将在数据增长时获得长期性能优势。