【发布时间】:2020-06-23 10:34:06
【问题描述】:
查询 Cassandra 的最快方法是什么? 我有一个表,其中主键由 3 列组成。我通过其中一列进行查询,速度非常慢(我通过 Spark 查询)。三个人的查询会更快吗?
我还有一个由两列组成的分区键。不幸的是,我用来获取记录的列不是分区键中的列之一。会不会因此而变慢?
任何见解都是有帮助的。
【问题讨论】:
查询 Cassandra 的最快方法是什么? 我有一个表,其中主键由 3 列组成。我通过其中一列进行查询,速度非常慢(我通过 Spark 查询)。三个人的查询会更快吗?
我还有一个由两列组成的分区键。不幸的是,我用来获取记录的列不是分区键中的列之一。会不会因此而变慢?
任何见解都是有帮助的。
【问题讨论】:
不幸的是,我用来获取记录的列不是分区键中的列之一。会不会因此而变慢?
是的,这可能就是速度慢的原因。尽管公平地说,Spark 旨在查询分布式数据存储。它的设计初衷不是为了快速。
所以我假设您的 PRIMARY KEY 定义如下所示:
PRIMARY KEY((A,B),C)
C查询慢的原因是Cassandra(Spark)无法根据C判断出集群中哪个节点负责数据。因此,需要检查每个节点的 C 值是否满足您的查询。
全部 3 人查询会更快吗?
是的,三个都查询可能会更快。这是因为分区键由A 和B 组成。对于基于分区键的查询,在这种情况下,A 和 B 的键值被散列在一起。该哈希与每个节点负责的令牌范围相匹配。这样就可以很容易地确定包含所需数据的目标节点,而无需检查每个节点的匹配值。
如果我只使用主键中的 1 列(假设是 A)进行查询,那也很快吧?
不,它不会。给定(A,B)的分区键定义,不能单独由A确定包含数据的节点。事实上,由于结果集可能会更大,通过A 查询可能会比通过C 查询慢。
【讨论】:
C 上的查询应该比在另一列上的查询更快 - Spark 连接器会将执行下推到 Cassandra,因此过滤将在 Cassandra 端进行,而不是将所有内容读入内存并过滤Spark 方面...