假设我们有以下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');
我被告知,此查询将进行次优于同样,我们将所有分组分为单独的查询,并使用Union加入结果(上面的12个子查询)。原因是联合将被分为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行)的性能提高。我尝试了谷歌搜索,但找不到任何可以支持或证明错误的联盟假设的东西。
我正在使用Spark SQL(Hive 2)和Java CQL驱动程序访问Cassandra中的数据。
我感谢任何有用的信息。
谢谢
几个点,
-
如果您始终要在源前进行过滤类别,则更好地将模式更改为((日期,类别,源),ID),因为订单确实很重要。
-
性能不仅基于您正在尝试的记录数量,而且它更多地基于呼叫中使用了多少个分区键 - 上面的示例似乎太少了,无法证明性能差异。如果您可以尝试使用更多的分区尝试相同的方案(例如,要过滤50个日期而不是2个日期),那么您可以看到越来越糟。
当您向12个节点的群集发送12个查询时,12个节点可能会独立获取数据并通过协调员将其返回。通过并行查询,这是适当的工作分布。这就是为什么分解查询更快的原因。如果您没有足够的数据或足够的节点,则可能永远不会看到这种差异。
如果分区很大,无论分配方式如何,您仍然可能会得到相同的延迟。不知道数据是什么样子,您拥有多少个分区以及您拥有多少个节点,很难说哪个节点要快, you 。
>