为什么Cassandra UPDATE没有违反写入前的无读取规则

时间:2015-04-28 00:33:14

标签: cassandra-2.0 cqlsh

我对两个看似矛盾的关于卡桑德拉的陈述感到困惑

  1. 写入之前没有读取(可能这是因为写入是连续的,而读取需要扫描主键索引)
  2. INSERT和UPDATE具有相同的语义(在older versionCQL manual中说明,但可能仍被认为基本上是正确的)
  3. 假设我创建了以下简单表:

    CREATE TABLE data (
      id varchar PRIMARY KEY,
      names set<text>
    );
    

    现在我插入一些值:

    insert into data (id, names) values ('123', {'joe', 'john'});
    

    现在,如果我进行更新:

    update data set names = names + {'mary'} where id = '123';
    

    结果如预期:

     id  | names
    -----+-------------------------
     123 | {'joe', 'john', 'mary'}
    

    这不是必须在写入之前进行读取的情况吗? &#34;成本&#34;似乎是以下

    1. 阅读专栏的费用
    2. 创建两套联合的成本(此处可忽略不计,但较大的集合可能会显着)
    3. 使用密钥和新列数据编写数据的成本
    4. 插入仅仅是最后一个。

1 个答案:

答案 0 :(得分:1)

写作前无需阅读。
在内部,每个集合每个条目使用一列存储数据 - 当您在集合中请求新条目时,操作在单列中完成*:如果该列已经存在,则将覆盖该列,否则将创建该列(InsertOrUpdate)。 这就是为什么集合中的每个条目都可以具有自定义ttl和写入时间的原因。

*使用MapSet这是透明的,有一些内部技巧可以在List内允许多个具有同名的列。