在我访问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) 所以我认为可能是某些配置是原因。但我不知道它们是什么。
答案 0 :(得分:2)
概念上UPDATE和INSERT是相同的,所以我期望类似的性能。 UPDATE不会检查数据是否已经存在(除非您使用IF EXISTS
进行轻量级交易)。
我注意到,如果每个方法都不为null,那么每个方法都会准备一个语句。该声明是否有可能每次都被重新定位?这将为每个方法调用添加一个往返。我还注意到InsertSome
每次调用都会执行多次插入,其中UpdateOne
/ UpdateOneField
执行一个语句。因此,如果每次都准备好该语句,那就是每次更新的调用,每次插入只对列表执行一次。
答案 1 :(得分:-1)
Cassandra使用日志结构合并树作为磁盘格式,这意味着所有写入都是按顺序完成的(数据库是仅附加日志)。这意味着较低的写入延迟。
在集群级别,Cassandra还能够通过对密钥空间进行分区来实现更高的写入可扩展性,这样每台计算机只负责部分密钥。这意味着更高的写入吞吐量,因为可以并行完成更多的写入。