当客户端发送更新查询时,Cassandra 何时获取完整行

When does Cassandra fetches full rows when a client sends a update query

举个例子table:

CREATE TABLE student (
    id int PRIMARY KEY,
    name text,
    phone text
);

并且客户端发送更新查询,例如:update student set name='name_temp' where id in (1, 2);

我的问题是什么被保存到 memtable,它是否保存了 ids 1 和 2 的整行(这意味着它必须首先获取整行)并更新了 [=12= 的值] 列或只是三角洲?什么时候提取整行,正如我假设的那样,当它写入 SSTable 时,它​​必须用最新的“name”列值写入整行。

编辑:

为了完整理解,请阅读评论作为所选答案的一部分。

Update也是在Cassandra中写的。因此,当您更新时,这两个分区首先写入内存表,然后刷新到新的 sstable 中。

只有更新后的值才会写入内存表。未提取完整行。所以更新的单元格被写入。

Cassandra 解决读取路径中的不同写入(旧数据和更新数据)。对于每个单元格,Cassandra 都会存储写入时间的元数据,用于确定最新数据(最后写入获胜)。

同一分区的不同数据通过压缩过程进行压缩。

@rafel,对您的问题的简短回答是仅更新已更改的列。

这里有一个关于写入路径的好资源:https://docs.datastax.com/en/cassandra-oss/3.0/cassandra/dml/dmlWriteUpdate.html

此注释位于页面底部:

注意:一些数据库操作可能只写入一行的部分更新,因此一行的某些版本可能包含一些列,但不是全部。在压缩或写入期间,Cassandra 使用每列的最新版本从部分更新中组装每行的完整版本。

在 Cassandra 中,INSERTUPDATEDELETE 语句都是底层的插入。 Cassandra 不执行先读后写(轻量级事务除外),因此您的查询:

UPDATE student SET name='name_temp' WHERE id IN (1, 2);

在更新 2 个分区之前不“获取行”。

它所做的只是将 2 条新记录插入 student table,其中仅设置了 name 列——对于这 2 个特定的突变,没有值列 phone.

假设这 2 条记录没有新的突变 (inserts/updates/deletes),以下记录将从内存table 刷新到磁盘:

{ id = 1, name = 'name_temp' }
{ id = 2, name = 'name_temp' }

Cassandra 具有稀疏存储,这意味着只有设置了值的列存储在磁盘上。由于突变不包含 phone 列,因此它不会包含在由 memtable 刷新产生的新 SSTable 中。干杯!