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
| 归档时间: |
|
| 查看次数: |
1029 次 |
| 最近记录: |