Cassandra Java驱动程序性能:带有IN子句的CQL查询具有很高的值

时间:2018-03-16 00:23:45

标签: java cassandra cassandra-2.0 cassandra-3.0 cqlsh

我们正在使用Datastax Cassandra java驱动程序(版本3.x)。有一个带有'IN'子句的已记录批处理Select语句,具有大量值。由于这个原因,我们面临着一个严重的低绩效问题。以下是调试Java应用程序时可见的查询格式:

SELECT COL1,COL2,... FROM XXXX WHERE PARTITIONKEY IN()和CLUSTERINGKEY IN();

任何人都可以分享当有大量值可以在其中传递时,如何处理具有多个IN子句的SELECT。

Session#executeAsync可以解决此问题。

感谢。

1 个答案:

答案 0 :(得分:0)

不要在IN查询中使用分区键(如果性能不是问题,可以使用有限数量的固定数据)。它给Coordinator节点带来了很多工作。您可以使用IN进行聚类键,但也要确保列表不是太大。

executeAsync是最好的方法。我在这里添加了一个代码片段。

PreparedStatement getInfo = session.prepare("SELECT COL1, COL2, ... FROM XXXX WHERE PARTITIONKEY = ?");

        List<ResultSetFuture> futures = new ArrayList<>();
        for (Object key : list) {
            ResultSetFuture future = session.executeAsync(getInfo(key));
            futures.add(future);
        }
        for (ResultSetFuture future : futures) {
            try {
                ResultSet rs = future.getUninterruptibly();
                Row rw = rs.one();
                if (rw != null) {
                    // set DB info into list or DTO 
                }
            } catch (Exception e) {
                // print log
                LOGGER.error("", e);
            }
        }

这是一个示例代码。请阅读此链接了解更多详情:

Cassandra Query Patterns: Not using the “in” query for multiple partitions.