Cassandra - 查询聚类键

use*_*961 12 cql primary-key cassandra clustering-key

我刚刚开始使用Cassandra,我正在尝试创建具有不同分区和群集密钥的表,以查看它们如何以不同方式查询.

我用表格的主键创建了一个表 - (a),b,c,其中a是分区键,b,c是聚类键.

查询时我注意到以下查询:

select * from tablename where b=val;
Run Code Online (Sandbox Code Playgroud)

结果是:

无法执行此查询,因为它可能涉及数据过滤,因此可能具有不可预测的性能.如果要在性能不可预测的情况下执行此查询,请使用ALLOW FILTERING

使用"ALLOW FILTERING"可以得到我想要的东西(尽管我听说它对性能有害).

但是当我运行以下查询时:

select * from tablename where c=val;
Run Code Online (Sandbox Code Playgroud)

它说:

PRIMARY KEY列"c"不能被限制(前一列"b"不受限制或非EQ关系)

并且根本没有"允许过滤"选项.

我的问题是 - 为什么所有的聚类键都不一样?与分区键"a"相邻的列b被赋予"允许过滤"选项,允许查询它,而查询列"c"似乎根本不可能(给定该表的布局方式).

允许过滤获取cassandra扫描所有SSTable并在分区键丢失时从中获取数据,那么为什么我们不能执行相同的列c?

Aar*_*ron 18

这并不是说聚类键不是一样的,而是你不能跳过它们.这是因为Cassandra使用群集键来确定分区内的磁盘排序顺序.

要添加到您的示例,请假设PRIMARY KEY ((a),b,c,d).您可以通过指定just b或者b和来运行查询(使用ALLOW FILTERING)c.但它不允许您指定cd(跳过b)或bd(跳过c).

作为一个副节点,如果您真的希望能够仅通过查询b或仅查询c,那么您应该使用这样设计的附加表来支持这些查询.允许过滤是一种创可贴,并不是你应该在生产Cassandra部署中做的事情.