在 cassandra 列族中插入多行的最有效方法是什么。是否可以在一次通话中做到这一点。
现在我的方法是添加多列然后执行。在一次通话中,我坚持了一行。我正在寻找策略,以便我可以进行批量插入。
在 cassandra 列族中插入多行的最有效方法是什么。是否可以在一次通话中做到这一点。
现在我的方法是添加多列然后执行。在一次通话中,我坚持了一行。我正在寻找策略,以便我可以进行批量插入。
CQL 包含一个BEGIN BATCH...APPLY BATCH
语句,允许您对多个插入进行分组,以便开发人员可以创建和执行一系列请求(请参阅http://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2 -0)。
以下对我有用(Scala):
PreparedStatement ps = session.prepare(
"BEGIN BATCH" +
"INSERT INTO messages (user_id, msg_id, title, body) VALUES (?, ?, ?, ?);" +
"INSERT INTO messages (user_id, msg_id, title, body) VALUES (?, ?, ?, ?);" +
"INSERT INTO messages (user_id, msg_id, title, body) VALUES (?, ?, ?, ?);" +
"APPLY BATCH" );
session.execute(ps.bind(uid, mid1, title1, body1, uid, mid2, title2, body2, uid, mid3, title3, body3));
如果事先不知道要执行哪些语句,可以使用以下语法(Scala):
var statement: PreparedStatement = session.prepare("INSERT INTO people (name,age) VALUES (?,?)")
var boundStatement = new BoundStatement(statement)
val batchStmt = new BatchStatement()
batchStmt.add(boundStatement.bind("User A", "10"))
batchStmt.add(boundStatement.bind("User B", "12"))
session.execute(batchStmt)
注意: BatchStatement
最多只能容纳 65536 条语句。我很难学到这一点。:-)
Cassandra 中有一个批量插入操作。即使在不同的列族中,您也可以将插入批处理在一起,以提高插入效率。
在 Hector 中,您可以使用HFactory.createMutator
然后使用add
返回的 Mutator 上的方法将操作添加到您的批处理中。准备好后,打电话execute()
。
如果您使用的是 CQL,那么您可以通过BEGIN BATCH
以APPLY BATCH
.
您可以将多个插入语句添加到文件中并使用“cqlsh -f”执行该文件。
您还可以使用 CQL 将批量插入到 cassandra 中,如下面的链接所述: http ://www.datastax.com/documentation/cassandra/1.2/index.html#cassandra/cql_reference/batch_r.html
尝试插入多行时。数据库连接 RTT 可能是性能瓶颈。在那种情况下,我们通常需要一种方法来避免等待一个INSERT
完成,以便我们可以开始我们的下一个INSERT
。目前据我所知有两种方法:
LOGGED BATCH
,但正如这个问题所说,BATCH
可能不会在所有情况下都有性能提升。execute_async
方法此外,您可以在执行之前准备 SQL 语句。我没有测试准备好的语句与普通插入的整体性能。但我认为如果有数千个INSERT
或更多,你应该得到性能提升。