2012-01-09 97 views
8

我试图为我的测试创建一些用户。我使用cassandra-cql gem为Ruby on Rails创建了一个从0到100000的循环中的用户,然后我统计了数据库中的用户,结果只有10000个用户。如果我创建9000,一切工作正常。首先,我认为用户不存在,但我使用Apollo WebUI作为Cassandra,并且我可以找到具有ID 100000和下面的用户的用户。为什么会发生?用cassandra-cql错误计数(*)

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

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 

回答

23

CQL操作限制了将返回给用户的行数和列数。默认情况下,此限制为10,000。由于count(*)操作实际上必须提取所有行以获取计数,所以它也受到10,000行默认值的限制。你可以增加限制的查询(虽然我不建议这样做):

SELECT count(*) FROM users limit 20000; 

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

+1

谢谢你! – user934801 2012-01-10 22:13:14

+0

嗨,我可以问一下你正在使用哪种版本的cassandra?我面临着一个相关的问题,'select count(*)'和'limit'似乎完全被忽略了:http://stackoverflow.com/questions/36174805/cassandra-cql-select-count-with-limit – light 2016-04-02 19:09:09

+0

This问题来自2012年1月,所以最可能的是Cassandra 1.0.X. CQL自那时以来一直在进行大修,现在语义完全不同。 – psanford 2016-04-02 23:27:37