Cassandra java查询性能计数(*)或全部()

Cassandra java查询性能计数(*)或全部(),java,cassandra,cassandra-2.0,Java,Cassandra,Cassandra 2.0,我想知道,结合使用ApacheCassandra和java哪个更快。我有以下选项来获得结果: Statement s = QueryBuilder.select().from("table").where(QueryBuilder.eq("source",source); ResultSet resultSet = session.execute(s); if (resultSet.all().size() == 0) { //Do Something } 实现我的计数的第二个选项是: R

我想知道,结合使用ApacheCassandra和java哪个更快。我有以下选项来获得结果:

Statement s = QueryBuilder.select().from("table").where(QueryBuilder.eq("source",source);
ResultSet resultSet = session.execute(s);
if (resultSet.all().size() == 0) {
  //Do Something
}
实现我的计数的第二个选项是:

ResultSet rs = session.execute("SELECT COUNT(*) as coun FROM table WHERE source = '"+source+"'");
Row r = rs.one();
if (r.getLong("count") == 0) {
  //Do Something
}
在每个查询中,最大计数为1。现在我的问题是,一般来说,哪一个会更快。

只需调用System.currentTimeMillis以获取这两个选项并打印出来即可。 如果毫秒精度不够,请尝试System.nanoTime


我在多个表上测试了几个查询,使用count*的版本比使用resultSet.all.size==0的版本快得多。我使用CQLSH来尝试使用以下查询哪个更快,应该与java查询相同:

SELECT COUNT(*) as coun FROM table WHERE source = '...';
慢一点的:

SELECT * FROM table WHERE source = '...';

您必须根据网络流量来考虑这两个查询,这不仅适用于cassandra,而且适用于网络上的任何请求,例如jdbc请求、rest请求

SELECT * FROM table WHERE source = '...';
当您执行此查询,然后调用ResultSetall时,您正在检索所有*分区,其中where子句显然保存在使用datastax驱动程序的进程的内存中,并实例化一个包含所有行的ArrayList,最后调用一个简单的Listsize。 你必须记住这一点

*请注意,当查询检索到的行数大于指定的行数时,all方法还可以通过网络生成多个请求。这是更多的延迟

SELECT COUNT(*) as coun FROM table WHERE source = '...';
通过这个查询,您也在支付延迟,但这只是不可避免的。这就是将查询发送到cassandra集群并接收响应的RTT。 因为这将是一个简单的整数,所以它不会由于分页而产生多个请求,并且会消耗很少的bandwith

此外,IMHO如果您根本不需要行信息,那么使用select count将是一个更好的选择,因为您在需要的内容中是明确的,这将使服务器数据库、web服务器等有机会以特定的方式处理请求并提高性能。
例如,如果您的查询没有where子句,并且您只需要行的总数,其中包含select count*from。。。服务器可以利用每个表的内部计数器,更快地为查询提供服务。然而,因为在cassandra模型中,不可能保持计数器的一致性,但我认为这很清楚我的意思。

知道的唯一方法是分析它。但是,由于第二个没有返回行,我默认情况下会支持这一点。如果您正在执行count*之类的分析查询,您可能需要cassandra的Spark ontop之类的查询。请确保多次运行查询以获得良好的样本。当尝试在CQLSH中优化查询时,NODETOOL会有所帮助。
SELECT COUNT(*) as coun FROM table WHERE source = '...';