【问题标题】:why wouldn't Cassandra allow querying/filtering on columns without secondary indices even when primary key is specified为什么即使指定了主键,Cassandra 也不允许对没有二级索引的列进行查询/过滤
【发布时间】:2018-11-24 16:26:51
【问题描述】:

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

【问题讨论】:

    标签: cassandra secondary-indexes


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-12-01
      • 2020-07-18
      • 2013-09-02
      • 2018-09-18
      • 2019-10-08
      • 2016-04-05
      • 2021-09-10
      • 2012-10-10
      • 1970-01-01
      相关资源
      最近更新 更多