如何解决当客户端发送更新查询时,Cassandra 何时获取完整行
让我们举个例子:
CREATE TABLE student (
id int PRIMARY KEY,name text,phone text
);
客户端发送更新查询,如:update student set name='name_temp' where id in (1,2);
我的问题是什么会被保存到 memtable 中,它是保存 id 1 和 2 的整行(这意味着它必须先获取整行)并更新 name
列的值还是仅保存增量?我假设当它写入 SSTable 时,整行什么时候被获取,它必须用最新的“name”列值写入整行。
编辑:
如需完整理解,请阅读所选答案中的评论。
解决方法
Update 也是用 Cassandra 写的。因此,当您更新时,这两个分区首先写入 memtable,然后刷新到新的 sstable。
只有更新的值写入内存表。未获取完整行。因此,更新的单元格被写入。
Cassandra 在读取路径期间解析不同的写入(旧数据和更新数据)。 Cassandra 为每个单元存储写入时间的元数据,用于确定最新数据(Last Write Wins)。
同一个partition的不同数据通过compaction的过程进行compaction。
,@rafel,您问题的简短回答是仅更新已更改的列。
这里有一个关于写入路径的好资源:https://docs.datastax.com/en/cassandra-oss/3.0/cassandra/dml/dmlWriteUpdate.html
此注释位于页面底部:
注意: 某些数据库操作可能只写入行的部分更新,因此行的某些版本可能包含某些列,但不是全部。在压缩或写入期间,Cassandra 使用每列的最新版本,从部分更新中组装出每一行的完整版本。
,在 Cassandra 中,INSERT
、UPDATE
和 DELETE
语句都是幕后插入。 Cassandra 不进行先读后写(轻量级事务除外),因此您的查询:
UPDATE student SET name='name_temp' WHERE id IN (1,2);
在更新 2 个分区之前不会“获取行”。
它所做的只是向 student
表中插入 2 条新记录,其中仅设置了 name
列——对于这 2 个特定突变,列 phone
没有值.
如果这 2 条记录没有新的变化(插入/更新/删除),以下记录将从内存表刷新到磁盘:
{ id = 1,name = 'name_temp' }
{ id = 2,name = 'name_temp' }
Cassandra 具有稀疏存储,这意味着只有设置了值的列才会存储在磁盘上。由于突变不包含 phone
列,因此它不会包含在由内存表刷新产生的新 SSTable 中。干杯!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。