我如何像这样一个在Cassandra上执行UPDATE CQL查询:
UPDATE table_name SET COUNT = COUNT + 1 WHERE ID = ?
尽可能快,例如,如果我发送100-300条记录,其中0-10将被更新。总记录可能是
SELECT count(*), min("count"), max("count") FROM table_name;
-- result 300000 | 1 | 120
我已经测试了BatchStatement.Type.UNLOGGED
和executeAsync
。一般而言,按性能赢得2批次,但不建议使用,请参见CASSANDRA-9283。我知道Cassandra用于Insert语句,但是对于我的情况也许存在一些好的模式?
答案 0 :(得分:3)
计数器更新需要paxos循环和写入之前的读取。它是Cassandra中最慢的操作。相反,您可能想执行类似事件源计数器的操作。有一个((count_key, yymmdd) id)
,然后为每个记录插入一个新的timeuuid。将当前计数保留在内存中并在某个位置递增(甚至可以仅使用Redis)。然后在每天结束时在卡桑德拉写下当天的总数。如果发生故障或其他情况,您可以遍历事件计数并恢复内存中计数。