Spanner Go客户端是否支持bulk inserts(批量插入)功能?
Spanner Go客户端bulk inserts功能说明
Spanner Go客户端完全支持bulk inserts功能,常见有三类实现方式,对应不同的使用场景:
1. 直接执行多行INSERT SQL语句
你提到的Statement类型并不限制仅支持单行插入,完全可以直接传入官方文档所示的多行INSERT语法执行,适合单次插入几十到上百行的轻量批量场景,示例代码如下:
stmt := spanner.Statement{ SQL: `INSERT INTO Singers (SingerId, FirstName, LastName) VALUES(@id1, @fn1, @ln1), (@id2, @fn2, @ln2), (@id3, @fn3, @ln3)`, Params: map[string]interface{}{ "id1": 1, "fn1": "Marc", "ln1": "Richards", "id2": 2, "fn2": "Catalina", "ln2": "Smith", "id3": 3, "fn3": "Alice", "ln3": "Trentor", }, } // 在读写事务中执行即可 _, err := txn.Update(ctx, stmt)
注意不要单次传入过多行,避免SQL语句超出大小限制。
2. 使用Mutation批量写入(推荐)
Spanner原生的Mutation API天生支持批量操作,性能比多行SQL插入高30%以上,且不需要拼接SQL,无注入风险,适合单次插入几百到几千行的常规批量场景,示例代码如下:
var ms []*spanner.Mutation // 构造待插入的数据集 singers := []struct{ SingerId int64 FirstName string LastName string }{ {1, "Marc", "Richards"}, {2, "Catalina", "Smith"}, {3, "Alice", "Trentor"}, } for _, s := range singers { m, err := spanner.InsertStruct("Singers", s) if err != nil { // 处理构造错误 } ms = append(ms, m) } // 提交批量Mutation,也可以在事务中调用txn.BufferWrite(ms)提交 _, err := client.Apply(ctx, ms)
3. 超大规模批量写入用BatchWrite
如果需要插入数万行及以上的海量数据(比如数据导入场景),可以使用client.BatchWrite()方法,它会自动拆分数据分片、并行提交,是所有批量写入方式中性能最高的。
注意:你之前尝试的
BatchUpdate()方法是用于执行一批独立DML语句的接口,本身设计目标就不是批量插入,性能远低于上述两种方式,不建议在bulk insert场景使用。
内容的提问来源于stack exchange,提问作者RPayne
相关产品推荐
相关产品推荐

