Важно
К моему большому разочарованию, я не могу больше предлагать использовать mgo, так как, по-видимому, больше не поддерживается на момент этогописать .
Мне было любопытно, и я собрал небольшой собственный тест. Он использует один экземпляр MongoDB через докер:
$ docker run -d --name mongobench -p 27017:27017 mongo
731e5f57d677718244c2304a992abd44a5a4bbad6f1fd8e5a23e53b3c4f9ada4
Примечание: получаемый хеш будет другим.
В соответствии с тестом, он имеет два аспекта: простойвкладыши и объемные вкладыши. Массовые вставки являются предпочтительным способом работы с массовыми вставками.
Он проверяет как драйвер mgo, так и драйвер mongo-go:
package mongobench
// Use
// docker run -d --name mongobench -p 27017:27017 mongo
// to create a suitable test instance and access it via
// docker exec -it mongobench mongo
import (
"context"
"log"
"testing"
"github.com/globalsign/mgo"
"github.com/globalsign/mgo/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
const DefaultHost = "localhost:27017"
const DefaultDB = "test"
const DefaultCollection = "bench"
var sess *mgo.Session
var client *mongo.Client
func init() {
var err error
sess, err = mgo.Dial(DefaultHost)
if err != nil {
log.Fatalf("setting up session: %s", err)
}
client, err = mongo.NewClient(options.Client().ApplyURI("mongodb://" + DefaultHost))
if err != nil {
log.Fatalf("setting up client: %s", err)
}
if err = client.Connect(context.Background()); err != nil {
log.Fatalf("connecting with client: %s", err)
}
}
func BenchmarkMgoInsert(b *testing.B) {
c := sess.DB(DefaultDB).C("simple")
if _, err := c.RemoveAll(bson.M{}); err != nil {
b.Logf("cleaning collection 'simple': %s", err)
b.FailNow()
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
if err := c.Insert(&Data{ID: bson.NewObjectId(), Counter: i}); err != nil {
b.Logf("error inserting: %s", err)
b.FailNow()
}
}
}
func BenchmarkMgoBulk(b *testing.B) {
c := sess.DB(DefaultDB).C("bulk")
if _, err := c.RemoveAll(bson.M{}); err != nil {
b.Logf("cleaning collection 'simple': %s", err)
b.FailNow()
}
b.ResetTimer()
bulk := c.Bulk()
for i := 0; i < b.N; i++ {
bulk.Insert(&Data{ID: bson.NewObjectId(), Counter: i})
}
if _, err := bulk.Run(); err != nil {
b.Logf("executing bulk: %s", err)
b.FailNow()
}
}
func BenchmarkMongoInsert(b *testing.B) {
c := client.Database(DefaultDB).Collection("mongosimple")
if _, err := c.DeleteMany(context.Background(), bson.M{}); err != nil {
b.Logf("cleaning collection 'mongosimple': %s", err)
b.FailNow()
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
c.InsertOne(context.Background(), &Data{ID: bson.NewObjectId(), Counter: i})
}
}
func BenchmarkMongoBulk(b *testing.B) {
c := client.Database(DefaultDB).Collection("mongobulk")
if _, err := c.DeleteMany(context.Background(), bson.M{}); err != nil {
b.Logf("cleaning collection 'mongosimple': %s", err)
b.FailNow()
}
d := make([]mongo.WriteModel, b.N)
b.ResetTimer()
for i := 0; i < b.N; i++ {
d[i] = mongo.NewInsertOneModel().SetDocument(Data{ID: bson.NewObjectId(), Counter: i})
}
if _, err := c.BulkWrite(context.Background(), d); err != nil {
b.Logf("inserting bulk: %s", err)
b.FailNow()
}
}
goos: darwin
goarch: amd64
pkg: github.com/mwmahlberg/so-mongobench
BenchmarkMgoInsert-4 1164 1100919 ns/op 1501 B/op 44 allocs/op
BenchmarkMgoBulk-4 201560 6512 ns/op 258 B/op 4 allocs/op
BenchmarkMongoInsert-4 1171 1019140 ns/op 3642 B/op 66 allocs/op
BenchmarkMongoBulk-4 181040 7251 ns/op 1151 B/op 15 allocs/op
То, что мы видим, это то, чтооба драйвера на несколько порядков быстрее, чем вы описываете, поэтому можно предположить, что это не тот драйвер, который вызывает задержки.