插入速度比Cassandra中的Update快10倍。这是正常的吗?

时间:2017-02-17 12:50:59

标签: cassandra

在我访问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一样快。但它只能每秒INSERT / UPDATE 5行。这个cassandra集群是在GCE上运行的DataStax Enterprise(我在Google Cloud Launcher上使用了默认的DataStax Enterprise) 所以我认为可能是某些配置是原因。但我不知道它们是什么。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:-1)

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

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