gpt4 book ai didi

database - Cassandra:如何在没有EQ或IN限制的PRIMARY KEY的情况下使用 'ORDER BY'?

转载 作者:搜寻专家 更新时间:2023-10-30 22:24:37 25 4
gpt4 key购买 nike

我在 Scylla(Cassandra 兼容数据库)中有一个表定义如下:

create table s.items (time timeuuid, name text, primary key (time));

我想运行一个在特定时间后获取所有项目的查询,类似于以下内容:

select * from s.items where time>7e204790-43bf-11e9-9759-000000000004 order by time asc;

但有人告诉我,ORDER BY 仅在分区键受 EQ 或 IN 限制时才受支持。为了解决这个问题,我可以创建一个类似于以下内容的表和查询:

create table s.items (yes boolean, time timeuuid, name text, primary key (yes, time));

select * from s.items where yes=true and time>7e204790-43bf-11e9-9759-000000000004 order by time asc;

虽然这可行,但它似乎不是最佳解决方案。由于我对 Scylla 和 CQL 还很陌生,有没有更好/正确的方法来做到这一点?

最佳答案

您添加一个 bool 键并始终将其设置为"is"的解决方案基本上会创建一个包含所有数据的巨大分区。这很少是您真正想要的。如果这个分区是你的全部数据,这意味着即使你有一个 10 节点的集群,每个节点上有 8 个 CPU,集群中所有 80 个 CPU 中只有 3 个 CPU 会做任何工作(因为每个分区属于一个某些 CPU,并且 RF=3 时有三个副本)。

如果您想知道为什么您的原始解决方案不起作用并且 Scylla 拒绝了“ORDER BY”,那么问题是尽管 Scylla 可以扫描整个表以查找时间 X 之后的条目(您需要向查询添加“ALLOW FILTERING”),它没有有效的方法来按时间排序它找到的内容。在内部,不同的分区不是按分区键排序的,而是按“ token ”排序的,分区键的哈希函数。这种具有随机化效果的散列对于平衡集群上所有 CPU 之间的负载很重要,但会阻止 Scylla(或 Cassandra)以原始键顺序读取分区。

您可以做的一件事是按照 Alex 上面的建议,这是您的原始设置和建议的解决方案之间的中间地带:不要每个分区有一个项目,或者所有项目都在一个分区中,但是中间的东西:例如,假设在您的工作负载中,您每天收集 100MB 的数据。所以你使用天数作为分区键(而不是你的 bool)。某一天的所有数据都将位于一个分区中。 每一天的分区中,不同的条目(行)将按集群键顺序排序,这将是时间。使用此设置,要在特定日期之后检索所有项目,只需开始逐日查询即可。例如,查询第 134 天,然后是第 135 天,然后是第 136 天,然后……在每一天中,结果都已经排序。这样问题就解决了。

这种技术是一种相当著名的“时间序列”数据建模。 Scylla(和 Cassandra)甚至有一个针对此建模调整的特殊压缩策略,TWCS(时间窗口压缩策略)。

关于database - Cassandra:如何在没有EQ或IN限制的PRIMARY KEY的情况下使用 'ORDER BY'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55095992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com