【问题标题】:Insert is 10 times faster than Update in Cassandra. Is it normal?在 Cassandra 中插入比更新快 10 倍。正常吗?
【发布时间】:2018-03-21 15:15:32
【问题描述】:

在我访问 Cassandra 的 Java 应用程序中,它可以每秒插入 500 rows,但每秒只能更新 50 rows(实际上更新的行并不存在)。

更新一百个字段与更新一个字段一样快。

我只是在 Java 应用程序中使用CQL statements

这种情况正常吗?如何改进我的应用程序?

public void InsertSome(List<Data> data) {

    String insertQuery = "INSERT INTO Data (E,D,A,S,C,......) values(?,?,?,?,?,.............); ";
    if (prepared == null)
        prepared = getSession().prepare(insertQuery);

    count += data.size();
    for (int i = 0; i < data.size(); i++) {

        List<Object> objs = getFiledValues(data.get(i));
        BoundStatement bs = prepared.bind(objs.toArray());
        getSession().execute(bs);
    }
}

public void UpdateOneField(Data data) {
    String updateQuery = "UPDATE Data set C=? where E=? and D=? and A=? and S=?; ";

    if (prepared == null)
        prepared = getSession().prepare(updateQuery);

    BoundStatement bs = prepared.bind(data.getC(), data.getE(),
            data.getD(), data.getA(), data.getS());
    getSession().execute(bs);
}

public void UpdateOne(Data data) {
    String updateQuery = "UPDATE Data set C=?,U=?,F........where E=? and D=? and A=? and S=? and D=?; ";

    if (prepared == null)
        prepared = getSession().prepare(updateQuery);
    ......
    BoundStatement bs = prepared.bind(objs2.toArray());
    getSession().execute(bs);
}

架构:

Create Table Data (
  E,
  D,
  A,
  S,
  D,
  C,
  U,
  S,
  ...
  PRIMARY KEY ((E
  D),
  A, 
  S)
)  WITH compression =  { 'sstable_compression' : 'DeflateCompressor', 'chunk_length_kb' : 64 }
    AND compaction =  { 'class' : 'LeveledCompactionStrategy' };

另一种情况

我使用同一个应用程序来访问另一个 cassandra 集群。结果是不同的。 UPDATE 和 INSERT 一样快。但它每秒只能插入/更新 5 行。这个 cassandra 集群是在 GCE 上运行的 DataStax Enterprise(我在 Google Cloud Launcher 上使用了默认的 DataStax Enterprise) 所以我认为可能是某些配置是原因。但我不知道它们是什么。

【问题讨论】:

  • 您也可以在这里发布您的表的架构吗?

标签: cassandra


【解决方案1】:

在概念上 UPDATE 和 INSERT 是相同的,所以我希望性能相似。 UPDATE 不会检查数据是否已经存在(除非您正在使用 IF EXISTS 进行轻量级事务)。

我注意到,如果它不为空,您的每个方法都会准备一个语句。是否有可能每次都重新准备声明?这将增加每个方法调用的往返。我还注意到InsertSome 每次调用都会进行多次插入,其中UpdateOne / UpdateOneField 执行一个语句。因此,如果每次都准备好语句,那就是每次更新的调用,每次插入列表只执行一次。

【讨论】:

  • 我使用同一个应用程序来访问另一个 cassandra 集群。结果是不同的。 UPDATE 和 INSERT 一样快。但它每秒只能插入/更新 5 行。这个 cassandra 集群是在 GCE 上运行的 DataStax Enterprise(我在 Google Cloud Launcher 上使用了默认的 DataStax Enterprise)
【解决方案2】:

Cassandra 将日志结构的合并树用于磁盘格式,这意味着所有写入都是按顺序完成的(数据库是仅附加日志)。这意味着更低的写入延迟。

在集群级别,Cassandra 还能够通过对密钥空间进行分区以使每台机器只负责一部分密钥,从而实现更大的写入可扩展性。这意味着更高的写入吞吐量,因为可以并行完成更多的写入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2014-09-25
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    相关资源
    最近更新 更多