【问题标题】:Is Cassandra secondary index optimized if the partition key specified?如果指定了分区键,Cassandra 二级索引是否优化?
【发布时间】:2014-12-13 21:15:27
【问题描述】:

对于在 WHERE 子句中指定分区键的二级索引查询,二级索引查找是命中所有集群节点,还是只命中指定分区键的节点?
如果后者是正确的,那么二级索引也将非常适合高基数字段(仅适用于满足分区键的查询)。

编辑:例如,对于以下提要架构,查询特定提要(指定提要 ID)以检索现有或已删除提要项应该非常有效:

CREATE TABLE my_feed (
   feed_id int,
   item_id timeuuid,
   is_deleted boolean,
   data text,
   PRIMARY KEY (feed_id, item_id)
) WITH CLUSTERING ORDER BY (item_id DESC);

CREATE INDEX my_feed_is_deleted_idx ON my_feed (is_deleted);

==> SELECT * FROM my_feed WHERE feed_id=1 AND is_deleted=false; --efficient?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    何时以及何时不使用二级索引以及为什么在这里介绍:https://docs.datastax.com/en/dse/6.8/cql/cql/cql_using/useWhenIndex.html

    【讨论】:

      【解决方案2】:

      如果您先点击分区键,则不会是集群范围的操作。只有目标分区会被命中。如果分区中有很多行的宽行,则二级索引将是一种在分区命中后过滤掉它们的有效方法。

      【讨论】:

      • 不确定我是否理解“如果分区中有很多行的宽行”。如果我做对了,如果在查询 WHERE 子句中指定了分区键,则二级索引应该总是有效,无论索引字段的基数是高还是低(因为它不会集群范围的操作)。是否有任何文件支持这个案例?
      • 二级索引在 Cassandra 中并不是为了提高性能,而是为了允许您在其他情况下无法执行的查询(没有额外的表)。例如,如果您有聚类列,则需要按顺序指定它们。使用二级索引,在命中分区后,您可以有效地过滤任何列,而无需指定集群键。
      • 所以在这种情况下,即使是布尔字段的二级索引也是有效的(在问题中添加了一个示例)?
      • 性能明智,应该没问题。但请注意,对于非常低的基数(即 bool),每个节点上的索引表(索引在本地维护)将有一行表示 true,一行表示 false。这可能会成为一个问题,具体取决于每个分区内的行数。此外,如果它经常更新/删除,你可能会遇到墓碑限制。另一种方法是简单地查询和过滤客户端。阅读以下内容:datastax.com/documentation/cql/3.1/cql/ddl/…
      • @ashic,仅通过二级索引查询不利于高基数,因为许多节点试图获取少量数据,并且由于大量数据而获得非常低的基数(布尔值) - 既慢又需要分页。在宽行中指定分区键,您就知道数据在哪里,没有必要使用索引作为其值指向已经可用的分区键(不在行内)。它可以简单地“过滤”宽行,而不是返回分区键的所有行(IO),否则对我来说听起来像是“未优化”。基数在宽行中可能无关紧要,因为 OP 需要与约束匹配的数据。或者,这是一个已知的错误?
      猜你喜欢
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      • 2016-09-20
      • 1970-01-01
      • 2021-03-14
      • 2015-08-30
      • 1970-01-01
      相关资源
      最近更新 更多