cassandra - 同步 SELECT + INSERT 与 INSERT 之间的性能差异......如果 CQL 中不存在?

标签 cassandra cql cql3

我有一个 CQL 表(cql 3,cassandra 2.0.*),看起来像:

CREATE TABLE IF NOT EXISTS user_things (
   user_id bigint,
   thing_id bigint,
   created_at timeuuid,
  PRIMARY KEY (user_id, thing_id)
);

我想做一个插入像
INSERT INTO user_things (user_id, thing_id, created_at) VALUES (?, ?, now())

但前提是该行不存在。

我可以在两个同步语句中执行此操作(首先是 SELECT,如果 SELECT 没有返回行,则后跟 INSERT)或者我可以使用 INSERT ... IF NOT EXISTS。

CQL docs声明“但请注意,使用 IF NOT EXISTS 会产生不可忽略的性能成本(在内部,将使用 Paxos),因此应谨慎使用。”

我想知道是否有人做过基准测试,看看如果我们有很多这样的操作发生,什么性能更好? (每秒说数百个)

最佳答案

这在很大程度上取决于您使用的拓扑。如果将 IF NOT EXISTS 限制在本地数据中心(使用 LOCAL_SERIAL)并使用小的复制因子,则它非常快。如果您尝试在多个数据中心或具有更高复制因子的情况下使用它,那么它会显着变慢。有一个开放ticket以提高其性能,因此希望这将很快完成,因为它目前是一个过于昂贵的操作,有很多往返。

另一件会减慢 IF NOT EXISTS 速度的事情是在聚集行上使用它时。当您的表只有复合分区键且没有聚簇列时,它似乎工作得最快。

如果您采用先读后写路线,那么您还有其他问题需要处理。首先,您将遇到竞争条件,因为如果两个客户端大约同时进行读取,然后都决定进行写入,您将得到一个覆盖另一个,这使得读取毫无意义(请参阅此处的另一种方法) : collision detection . 如果不知何故你不介意竞争条件,并使用像 ONE 这样的低一致性进行读取和写入,那么它可能会胜过 IF NOT EXISTS。

您几乎必须针对您的系统和架构对其进行基准测试,以查看在您的情况下哪个更快。

关于cassandra - 同步 SELECT + INSERT 与 INSERT 之间的性能差异......如果 CQL 中不存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32597352/

相关文章:

php - 如何获取 cassandra(php) 中主键的最后一个值?

database - Cassandra 表定义/分区/建模

cassandra - 在 Cassandra 中为 map 中的元素选择 TTL

cassandra - 查询 Cassandra 的多列

cassandra - 如何将 RDD 插入(不保存或更新)到 Cassandra 中?

cql - CQL 可以用来查找返回 `null` 的方法吗?

python - Flask 的 Cassandra 连接池

java cassandra对象映射注释

scala - Spark SQL + Cassandra : bad performance

java - 写C*超时以不可预测的方式出现