0

我对 cassandra 有疑问(ScyllaDB(不支持索引!))

在我的场景中,我有一个包含三列的表

CREATE TABLE test (a text , b text , c text , PRIMARY KEY ( a , b ,c ) );

现在我想通过第二个集群键( c )选择数据,但需要 b 。

我的目标但不正确的查询是:

SELECT * FROM test WHERE c='...' ALLOW FILTERING

正确的查询是这样的:

SELECT * FROM test WHERE b='...' AND c='...' ALLOW FILTERING

我的问题有什么解决方案只能在选择查询中使用 b 集群键吗?

4

3 回答 3

5

您可以查询

  • 一个SELECT * FROM test WHERE a='...'
  • 甲和乙SELECT * FROM test WHERE a='...' AND b='...'
  • a 和 b 和 cSELECT * FROM test WHERE a='...' AND b='...' AND c='...'

但不是a和c。这是因为您需要分区键 + 零个或多个按定义顺序排列的集群键。

Cosmetic:在CREATE TABLE周围()不需要a,因为您不应用复合分区键:

CREATE TABLE test (a text, b text, c text, PRIMARY KEY (a, b, c))
于 2017-08-08T11:28:38.093 回答
1

正如其他人已经指出的那样,Cassandra 在跳过部分集群键时不支持过滤。虽然很容易将此视为一种限制,但深入了解为什么存在这种限制是有帮助的。

首先,该条款已经对集群中的所有Cassandra 节点ALLOW FILTERING施加了压力。由于查询未指定分区键,因此每个节点都必须通过从磁盘加载数据并丢弃与提供的条件不匹配的记录来处理它。但据我了解,由于 Cassandra 将数据存储在文件中的方式,它只能根据查询中提供的集群键加载其子集。但是,仅当指定了集群键的所有组件,或者仅省略了最后一个或多个组件时。

如果查询“跳过”集群键的一部分,就像在您的示例中一样,每个节点都必须从文件系统加载几乎所有内容并按顺序查找匹配项。您可以想象后果,即使过滤器匹配的实际记录数可以忽略不计。

这篇文章更详细地解释了ALLOW FILTERING这篇文章深入研究 SQLWHERE子句的影响。

可能的解决方案

我确信知道这个限制并不能解决您能够通过c分区键的组件进行查询的问题。据我所知,修改数据模型通常会提供更好的解决方案。

如果您发现自己经常查找数据c,请再添加一个表,该表c将成为分区键。您不仅可以获得缓存和有限数据加载的所有好处,而且您可以将查询限制在一个节点上。执行时间的改进通常会超过您尝试定制过滤查询所节省的磁盘空间。

于 2017-08-09T14:46:32.757 回答
0

一般来说,Scylla 旨在实现与 Cassandra 的功能对等。为此,Scylla 对集群密钥过滤的限制与 Cassandra 的相同(此线程中的其他评论适用)。Scylla 2.0 RC1 将很快发布,带来物化视图的实验版本。您可以在此处阅读 2.0 RC1 版本中支持和不支持的内容:http ://www.scylladb.com/2017/07/27/materialized-views-preview-scylla-2-0/ 。

于 2017-08-10T06:03:20.733 回答