【问题标题】:Why does querying based on the first clustering key require an ALLOW FILTERING?为什么基于第一个聚类键的查询需要 ALLOW FILTERING?
【发布时间】:2020-11-24 10:25:22
【问题描述】:

假设我有这张 Cassandra 表:

CREATE TABLE orders (
  customerId int, 
  datetime date, 
  amount int, 
  PRIMARY KEY (customerId, datetime)
);

那么为什么下面的查询需要 ALLOW FILTERING:

SELECT * FROM orders WHERE date >= '2020-01-01'

Cassandra 可以只访问所有单独的分区(即客户)并过滤集群键 date。由于 date 已排序,因此无需检索 orders 中的所有行并过滤掉与我的 where 子句匹配的行(据我了解)。

希望有人能赐教。

谢谢

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    发生这种情况是因为对于正常工作,Cassandra 需要分区键 - 它用于查找正在为其存储数据的机器。如果您没有分区键,例如在您的示例中,Cassandra 需要扫描所有数据以查找与您的查询匹配的数据。而这需要使用ALLOW FILTERING

    附:数据仅在单个分区内排序,而不是全局排序。

    【讨论】:

    • 谢谢亚历克斯。但我的观点是,Cassandra 可以扫描所有分区,但在这些分区内,由于排序的数据结构,它仍然可以进行快速过滤。因此,它不需要获取所有数据。
    • 哈哈好吧,你能解释一下为什么吗?不能只分两步执行此操作:1) 列出所有 n 个分区键 2) 运行 n 个查询,例如 SELECT * FROM orders WHERE customerid='{key}' date >= '2020-01-01'?那么您不必遍历所有数据,对吗?
    • 在 Cassandra 中,同一分区的数据可以在多个文件之间拆分,通过修复、提示、不同时间戳等接收数据。因此,您需要读取磁盘上的多个文件构建完整版本的分区,并找到与您的查询相关的数据...
    • 我还没关注。据我了解,如果您根据分区键(和集群键)进行过滤,您的查询将(相对)快。否则它(相对)慢,因为它首先需要获取所有数据(在该分区内)。现在在我的示例中,我 do 仅对分区键和集群键进行过滤。我对 Cassandra 的要求是跟踪所有分区键并为每个 n 分区键运行 n 查询。
    • Cassandra 有其他方法可以做到这一点 - 如果有必要,你可以这样做,但你需要了解权衡......首先,试着回答这个问题 - 如果你有 10 亿个分区键?这不是一个罕见的情况......
    猜你喜欢
    • 2013-10-24
    • 1970-01-01
    • 2011-07-27
    • 2011-05-15
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    相关资源
    最近更新 更多