查询中的 Cassandra 集群键 vs 多查询效率

ast*_*ght 3 cassandra

in集群键上的运算符是否比多个等式查询更有效?

select * from table where primaryKey1 = 1 and primaryKey2 = 2 and clusterKey in (1,2) 
Run Code Online (Sandbox Code Playgroud)

与 2 个查询。

select * from table where primaryKey1 = 1 and primaryKey2 = 2 and clusterKey = 1 

select * from table where primaryKey1 = 1 and primaryKey2 = 2 and clusterKey = 2
Run Code Online (Sandbox Code Playgroud)

小智 6

这取决于您要在IN运算符中放入多少值。在效率方面,两者将花费大约相同的时间来返回 resultSet。但如果您的值会更大,最好使用多个查询而不是使用IN运算符。

这是由于 Cassandra 的分布式节点结构,当您使用带有IN关键字的单个查询时,请求/响应将仅由一个节点处理。此外,如果出现问题,Cassandra 将从头开始再次运行整个查询,并且不会存储检索到的结果。

您可以在 Java 或 Python 中使用异步查询,它们将作为批处理运行多个查询。我将允许请求/响应通过多个节点,如果单个查询失败,它可以仅针对该特定查询重试。

例如:

CREATE TABLE IF NOT EXISTS users (id uuid PRIMARY KEY, name text);

SELECT * FROM users WHERE id IN (
    e6af74a8-4711-4609-a94f-2cbfab9695e5,
    281336f4-2a52-4535-847c-11a4d3682ec1,
    c32b8d37-89bd-4dfe-a7d5-5f0258692d05
);
Run Code Online (Sandbox Code Playgroud)

这不一定是最优的:这个查询将被发送到一个协调器节点,然后它必须查询每个分区键的副本。考虑到我们有一个智能令牌感知驱动程序,为每个分区键发送单独的查询(SELECT * FROM users WHERE id = ?)会更有效,这将直接到达正确的副本。然后剩下的就是在客户端整理结果。

Future<List<ResultSet>> future = ResultSets.queryAllAsList(session, 
"SELECT * FROM users WHERE id = ?",UUID.fromString("e6af74a8-4711-
4609-a94f-2cbfab9695e5"), UUID.fromString("281336f4-2a52-4535-847c-
11a4d3682ec1"));
for (ResultSet rs : future.get()) {
    process the result set    
}
Run Code Online (Sandbox Code Playgroud)

如需更多说明,请阅读以下链接:https : //lostechies.com/ryansvihla/2014/09/22/cassandra-query-patterns-not-using-the-in-query-for-multiple-partitions/

https://www.datastax.com/dev/blog/java-driver-async-queries