【发布时间】:2018-08-27 15:50:36
【问题描述】:
我想使用批处理语句从我的数据库中的 3 个表中删除一行以确保原子性。所有 3 个表中的分区键将相同。在我阅读的有关批处理语句的所有示例中,所有查询都是针对单个表的吗?就我而言,使用批处理语句是个好主意吗?或者,我应该避免吗?
我正在使用 Cassandra-3.11.2,并使用 C++ 驱动程序执行查询。
【问题讨论】:
我想使用批处理语句从我的数据库中的 3 个表中删除一行以确保原子性。所有 3 个表中的分区键将相同。在我阅读的有关批处理语句的所有示例中,所有查询都是针对单个表的吗?就我而言,使用批处理语句是个好主意吗?或者,我应该避免吗?
我正在使用 Cassandra-3.11.2,并使用 C++ 驱动程序执行查询。
【问题讨论】:
是的,您可以使用批处理来确保原子性。单个分区批处理更快(相同的表和相同的分区键)但仅适用于有限数量的分区(在您的情况下为三个)没关系。但不要将其用于性能优化(例如:减少多个请求)。如果你需要原子性,你可以使用它。
您可以查看以下链接:
Cassandra batch query performance on tables having different partition keys
Cassandra batch query vs single insert performance
How single parition batch in cassandra function for multiple column update?
已编辑
在我的情况下,表是不同的,但所有 3 个表中的分区键是相同的。这是单分区批处理的特例,还是完全不同的东西。
对于不同的表分区也不同。所以这是一个多分区批处理。 LOGGED 批处理用于确保不同分区(不同表或不同分区键)的原子性。 UNLOGGED 批处理用于确保单个分区批处理的原子性和隔离性。如果您使用 UNLOGGED 批处理进行多分区批处理原子性将无法保证。默认为 LOGGED 批处理。对于单个分区批处理默认为 UNLOGGED。因为单分区批次被认为是单行突变。对于单行更新,不需要使用 LOGGED 批处理。要了解 LOGGED 或 UNLOGGED 批次,我在下面分享了一个链接。
多分区批处理只能用于在不同表上实现少量写入的原子性。除此之外,应该避免使用它们,因为它们太贵了。
单分区批处理可用于实现原子性和隔离性。它们并不比普通写入贵多少。
但您可以使用多分区LOGGED批处理,因为分区有限。
一个非常有用的 Doc in Batch 并提供了所有详细信息。如果你读到这里,所有的困惑都会被清除。
Cassandra - to BATCH or not to BATCH
分区键令牌与行分区
表分区和分区键令牌不同。分区键用于决定数据驻留在哪个节点。对于相同的行键,分区令牌相同,因此驻留在同一节点中。对于不同的分区键或相同的键不同的表,它们是不同的行突变。即使对于相同的键,您也无法通过一次查询来获取不同分区键或不同表的数据。协调节点必须将其视为不同的请求或突变,并分别从复制节点请求实际数据。这是 C* 存储数据的内部结构。
每个表甚至都有自己的目录结构,这清楚地表明一个表的分区永远不会与另一个表的分区交互。
Does the same partition key in different cassandra tables add up to cell theoretical limit?
要了解 C* 如何映射数据的详细信息,请查看此链接:
Understanding How CQL3 Maps to Cassandra's Internal Data Structure
【讨论】: