【问题标题】:Performance of UNION vs IN for partitioning key in Cassandra在 Cassandra 中分区键的 UNION 与 IN 的性能
【发布时间】:2019-07-17 16:55:52
【问题描述】:

假设我们有以下 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 中的数据。

如果有任何有用的信息,我将不胜感激。

谢谢

【问题讨论】:

    标签: apache-spark-sql datastax cassandra-3.0 datastax-java-driver


    【解决方案1】:

    几点,

    1. 如果您总是要在源之前过滤类别,最好将架构也更改为 ((date, category, source), id),因为顺序很重要。

    2. 性能不仅取决于您尝试的记录数,还取决于调用时使用了多少分区键 - 上面的示例似乎太少,无法证明性能差异。 如果您可以尝试使用更多分区的相同方案(例如,您想要过滤 50 个日期而不是 2 个),那么您会看到 IN 变得更糟。

    【讨论】:

      【解决方案2】:

      当您向 12 个节点的集群发送 12 个查询时,这 12 个节点可能会独立获取数据并通过协调器返回数据。这是通过并行查询正确分配工作。这就是分解查询更快的原因。如果您没有足够的数据或足够的节点,您可能永远看不到这种差异。

      如果分区很大,无论分布如何,您仍然可能会遇到相同的延迟。不知道数据是什么样的,您有多少个总分区,以及您有多少个节点,很难判断哪个会更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        • 2015-07-18
        相关资源
        最近更新 更多