【问题标题】:Wrong count(*) with cassandra-cqlcassandra-cql 的计数错误(*)
【发布时间】:2012-02-06 10:20:15
【问题描述】:

我尝试为我的测试创建一些用户。我使用 Ruby on Rails 的 cassandra-cql gem 从 0..100000 开始循环创建用户,然后我计算了数据库中的用户,结果只有 10000 个用户。如果我创建 9000,一切正常。一开始我以为用户不存在,但是我使用了 Cassandra 的 Apollo WebUI,我可以找到 id 为 100000 的用户和下面的用户。为什么会这样?

我知道我应该使用计数器列来提供我的应用程序中的用户数,但我想知道这是我的错误还是失败。

def self.create_users
  (0..19000).each do |f|
    @@db.execute("INSERT INTO users (uid, first_name, last_name, email) VALUES (?,?,?,?)", f.to_s, "first_name", "last_name", "email")
  end
end

def self.count_users
  count = @@db.execute("SELECT count(*) FROM users")
  count.fetch do |c|
    return c[0]
  end
end

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

    CQL 操作会限制将返回给用户的行数和列数。默认情况下,该限制为 10,000。因为 count(*) 操作实际上必须取出所有行才能获得计数,所以它也受到默认 10,000 行的限制。您可以增加查询的限制(虽然我不推荐):

    SELECT count(*) FROM users limit 20000;
    

    请注意,这是一项昂贵的操作,尤其是当您有很多行时。您应该预计这种类型的查询对于任何中型或大型数据集都可能需要很长时间。如果可能的话,您应该将此计数反规范化为计数器或其他不需要获取列族中所有行的形式。

    【讨论】:

    • 您好,请问您使用的是哪个版本的 cassandra?我面临与select count(*)limit 相关的问题,似乎完全被忽略了:stackoverflow.com/questions/36174805/…
    • 这个问题是从 2012 年 1 月开始的,所以很可能是 Cassandra 1.0.X。从那时起,CQL 进行了彻底改革,现在具有完全不同的语义。
    猜你喜欢
    • 2013-09-04
    • 2016-07-10
    • 2012-02-07
    • 2012-06-23
    • 2012-07-11
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多