首页 > 解决方案 > 当我们提供所有分区键时,ALLOW FILTERING 是如何工作的?

问题描述

我已经阅读了至少 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' 过滤是否对通过正确定义的键较早检索的记录进行?在这种查询中仍然不鼓励 ALLOW FILTERING 吗?

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

提前致谢

标签: cassandrakeyfilteringpartition

解决方案


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

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

  3. 将 IN 子句与分区键一起使用不是一个好主意——尤其是上面的查询看起来不太好,因为它同时使用了分区键上的 IN 子句和允许过滤。

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


推荐阅读