当客户端发送更新查询时,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 中,INSERT
、UPDATE
和 DELETE
语句都是底层的插入。 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 中。干杯!
举个例子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 中,INSERT
、UPDATE
和 DELETE
语句都是底层的插入。 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 中。干杯!