1

在创建 Cassandra 改进票之前,我很好奇即使指定了整个主键(partition_key 和 clustering_key),也不允许在没有二级索引的情况下进行列查询的技术限制是什么?通过 PK,Cassandra 已经在特定的分区行,并且可以避免基于适当的列值过滤返回该行。如果这可以通过仅指定分区键来完成,而不是返回这么多宽行并在客户端进行过滤,它可以在服务器上过滤数据本身并且只使用 ALLOW FILTERING 直接返回匹配的行 - 该客户端知道风险吗?

select * from CF where partition_key = foo and clustering_key = bar and non_indexed_column = baz

当您使用带有分区键查询的二级索引时,执行计划显示它首先使用分区键来获取行,然后才使用索引扫描的单个分区键(如果数据存在),然后可能就地过滤以返回共同的反正数据。当您使用多个二级索引时,有一个优化可以首先选择最优化的一个。

我确实了解默认二级索引树像任何其他索引数据结构一样在内存中维护,并且索引实际上是对分区键的反向列族查找,仅索引同一节点内的本地数据。

我的问题是围绕 Cassandra 无法做到这一点而不是在指定整个主键时将其推送给客户端的“巨大技术开销或限制”?

Execution Plan summary with Primary Key and Secondary Index:
Seeking to partition beginning in data file | xyz
Executing single-partition query on indexed_column_idx
Seeking to partition indexed section in data file
Merging data from memtables and 15 sstables

Execution Plan summary with just the Secondary Index:
Executing indexed scan 
Executing single-partition query on indexed_column_idx
...

这两个都有道理。二级索引仅限于高基数列,然后,您不能创建许多二级索引而不滥用它们,也不能通过索引创建新的反向查找 CF 而不必担心空间和一致性。

4

1 回答 1

0

在 Cassandra 2.2+ 实例上尝试了相同的查询,它们都可以正常工作:),只要您指定分区键,您就可以“过滤任何列”。唯一需要注意的是,您必须指定 ALLOW FILTERING,这意味着如果由于对宽行进行全面扫描而缓慢且效率低下,客户端将承担风险/负担。

https://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause

于 2018-08-03T23:24:47.050 回答