Problem:
Mongo-Aggregationsabfragen dauern ungefähr Die Rückkehr dauert trotz der Verwendung von 500–650 Millisekunden mgo.
Beispielabfrage:
func (r userRepo) GetUserByID(id string) (User, error) { info, err := db.Info() if err != nil { log.Fatal(err) } session, err := mgo.Dial(info.ConnectionString()) if err != nil { log.Fatal(err) } defer session.Close() var user User c := session.DB(info.Db()).C("users") o1 := bson.M{"$match": bson.M{"_id": id}} o2 := bson.M{"$project": bson.M{ "first": "$first", "last": "$last", "email": "$email", "fb_id": "$fb_id", "groups": "$groups", "fulfillments": "$fulfillments", "denied_requests": "$denied_requests", "invites": "$invites", "requests": bson.M{ "$filter": bson.M{ "input": "$requests", "as": "item", "cond": bson.M{ "$eq": []interface{}{"$$item.active", true}, }, }, }, }} pipeline := []bson.M{o1, o2} err = c.Pipe(pipeline).One(&user) if err != nil { return user, err } return user, nil }
Frage: Gibt es einen offensichtlichen Grund für die langsame Abfrageleistung?
Hinweis: Vor jedem Aufruf wird die Methode mgo.Dial() aufgerufen Abfrage.
Antwort:
Ja, die langsame Leistung kann auf die wiederholten Aufrufe von mgo.Dial() zurückgeführt werden. Diese Methode stellt jedes Mal eine Verbindung zum MongoDB-Server her und kann mehrere hundert Millisekunden dauern. Um dieses Problem zu beheben, erstellen Sie eine globale Sitzungsvariable, stellen Sie einmal beim Start eine Verbindung her (z. B. in einer Paket-init()-Funktion) und verwenden Sie diese Sitzung (oder eine Kopie davon) für alle Abfragen.
Lösung:
var session *mgo.Session var info *db.Inf // Use your type here func init() { var err error if info, err = db.Info(); err != nil { log.Fatal(err) } if session, err = mgo.Dial(info.ConnectionString()); err != nil { log.Fatal(err) } } func (r userRepo) GetUserByID(id string) (User, error) { sess := session.Clone() defer sess.Close() var user User c := sess.DB(info.Db()).C("users") o1 := bson.M{"$match": bson.M{"_id": id}} o2 := bson.M{"$project": bson.M{ "first": "$first", "last": "$last", "email": "$email", "fb_id": "$fb_id", "groups": "$groups", "fulfillments": "$fulfillments", "denied_requests": "$denied_requests", "invites": "$invites", "requests": bson.M{ "$filter": bson.M{ "input": "$requests", "as": "item", "cond": bson.M{ "$eq": []interface{}{"$$item.active", true}, }, }, }, }} pipeline := []bson.M{o1, o2} err = c.Pipe(pipeline).One(&user) if err != nil { return user, err } return user, nil }
Das obige ist der detaillierte Inhalt vonWarum dauert die Ausführung meiner MGO-Abfrage 500–650 ms?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!