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

afdcj2ne  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(322)

我已经读了至少50篇关于这个的文章,但仍然不知道答案。。。我知道分区、集群和允许过滤是如何工作的,但是我不知道在查询中提供所有分区键的情况下使用允许过滤是什么情况。
我有一张这样的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\u id”过滤?在这种查询中是否仍不鼓励允许筛选?
在这种特殊情况下,我应该如何执行过滤?
提前谢谢

q1qsirdb

q1qsirdb1#

是的,它应该首先过滤掉分区,然后只对非键值进行过滤,根据这里提到的实验:https://dzone.com/articles/apache-cassandra-and-allow-filtering 我认为在大多数情况下,在所有密钥之后使用allow过滤是安全的。
这在很大程度上取决于你过滤掉的数据量-如果sport\u id=1的最后一个条件是试图过滤掉大部分数据,那么这将是一个坏主意,因为它给数据库带来了很大的压力,所以你需要考虑这里的取舍。
在分区键中使用in子句不是一个好主意,尤其是上面的查询看起来不太好,因为它在分区键上同时使用in子句和allow筛选。
建议—cassandra非常擅长在一秒钟内处理您所需的任意多个请求,其设计思想应该是一次发送更多更轻松的查询,而不是尝试发送一个需要大量工作的查询。因此,我的建议是在不过滤最后一列的情况下,对cassandra发出n个调用,每个调用在分区键上都带有=条件,然后在代码中组合并进行最终过滤(无论您使用哪种语言,我假设它都支持将所有这些调用并行发送到数据库)。通过这样做,您将在数据增长时获得长期性能优势。

相关问题