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
DDDOriginal
2025-01-03 19:27:43863Durchsuche

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
}

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!

Stellungnahme:
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