为什么即使指定了主键,Cassandra也不允许对没有二级索引的列进行查询/过滤

时间:2018-06-14 20:11:09

标签: cassandra secondary-indexes

在创建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而不必担心空间和一致性。

1 个答案:

答案 0 :(得分:0)

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

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