UNION与IN在Cassandra中分区键的性能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UNION与IN在Cassandra中分区键的性能相关的知识,希望对你有一定的参考价值。
假设我们有以下Cassandra表:
create table news(
date text,
source text,
category int,
id text,
title text,
tags text,
primary key ((date, source, category), id)
)
现在我们需要按日期,类别和来源支持查找:
select * from news where date in ('2019-01-23', '2019-01-24') and
category in (1, 4, 6) and source in ('Bloomberg', 'CNN');
我被告知,与我们将所有IN组拆分为单独的查询并使用UNION连接结果(上面的情况下为12个子查询)相比,此查询将执行次优。原因是UNION将被分成12个独立的查询,每个查询可以由集群中的一个节点(20多个节点)处理,我们将开始更快地获得结果。如果我们只是想确保返回的行数低于某个阈值,那么它应该更快。
select count(*) (
select * from news where date in ('2019-01-23', '2019-01-24') and
category in (1, 4, 6) and source in ('Bloomberg', 'CNN') LIMIT 10001
);
但是,我没有观察到小结果集和大结果集(250K行)的性能改进。我尝试使用谷歌搜索,但找不到任何可以支持或证明错误的UNION假设的东西。
我使用Spark SQL(Hive 2)和Java CQL驱动程序来访问Cassandra中的数据。
我将不胜感激任何有用的信息。
谢谢
答案
几点,
- 如果你总是要在源之前过滤类别,那么最好让Schema也像((日期,类别,来源),id一样改变,因为顺序很重要。
- 性能不仅取决于您正在尝试的记录数量,而且更多取决于呼叫中使用了多少分区密钥 - 上面的示例似乎太少,无法证明性能差异。如果您可以尝试使用更多分区的相同场景(例如,您想要过滤50个日期而不是2个),那么您可以看到IN变得更糟。
另一答案
当您向12个节点的集群发送12个查询时,12个节点可能会独立获取数据并通过协调器将其返回。这是通过并行查询正确分配工作。这就是为什么分解查询的速度更快。如果您没有足够的数据或足够的节点,您可能永远不会看到这种差异。
如果分区很大,无论分布如何,您仍可能会得到相同的延迟。不知道数据是什么样的,你拥有多少分区,以及你有多少个节点,很难说哪一个更快。
以上是关于UNION与IN在Cassandra中分区键的性能的主要内容,如果未能解决你的问题,请参考以下文章
带有分区键的 cassandra getendpoints 有空间