gpt4 book ai didi

cassandra - 如何有效地从 Cassandra 批量选择数据?

转载 作者:行者123 更新时间:2023-12-05 01:01:43 26 4
gpt4 key购买 nike

我知道 Cassandra 不支持批量查询,也不推荐使用 IN,因为它会降低性能。但是我必须通过id来获取数据,例如:

select * from visit where id in ([visit_id array])

描述表:

CREATE TABLE visit (
enterprise_id int,
id text,
........
PRIMARY KEY (enterprise_id, id)

数组可能有数千个元素。有什么办法可以有效地做到吗?

最佳答案

我首选的发出这类查询的方法是unroll IN 部分。这仅仅意味着您需要并行发出多个查询,因为 token-o-matic(又名 token 感知)驱动程序会将每个查询视为一个独立的查询,然后将这些查询传播到不同的节点,使每个单个节点成为负责将要到达的每个查询的协调器。

您应该最多运行 X 个查询并等待其中至少一个完成(我使用 Java):

final int X = 1000;
ArrayList<ResultSetFuture> futures = new ArrayList<>();
ArrayList<ResultSet> results = new ArrayList<>();
for (int i = 0; i < allTheRowsINeedToFetch; i++) {
futures.add(session.executeAsync(myBeautifulPreparedStatement.bind(xxx,yyy,zzz)));
while (futures.size() >= X || (futures.size() > 0 && futures.get(0).isDone())) {
ResultSetFuture rsf = futures.remove(0);
results.add(rsf.getUninterruptibly());
}
}

while (futures.size() > 0) {
ResultSetFuture rsf = futures.remove(0);
results.add(rsf.getUninterruptibly());
}

// Now use the results

这被称为背压,它用于将压力从集群移动客户端

这种方法的好处是您可以真正并行(X = allTheRowsINeedToFetch),也可以真正串行(X = 1),一切都在之间仅取决于您的集群硬件。 X 的低值意味着您没有使用集群功能足够,高值意味着您会遇到麻烦,因为您会开始看到超时。所以,你真的需要调整它。

关于cassandra - 如何有效地从 Cassandra 批量选择数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40790427/

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