Heim > Backend-Entwicklung > Golang > Warum dauert die Ausführung meiner MGO-Abfrage 500–650 ms?

Warum dauert die Ausführung meiner MGO-Abfrage 500–650 ms?

DDD
Freigeben: 2025-01-03 19:27:43
Original
854 Leute haben es durchsucht

Why is my mgo query taking 500-650ms to execute?

mgo – Abfrageleistung scheint durchweg langsam (500–650 ms)

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
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage