Rumah >pembangunan bahagian belakang >Golang >Mengapa pertanyaan mgo saya mengambil masa 500-650ms untuk dilaksanakan?

Mengapa pertanyaan mgo saya mengambil masa 500-650ms untuk dilaksanakan?

DDD
DDDasal
2025-01-03 19:27:43867semak imbas

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

mgo - prestasi pertanyaan kelihatan perlahan secara konsisten (500-650ms)

Masalah:

Pertanyaan pengagregatan Mongolia mengambil kira-kira 500-650 milisaat untuk kembali, walaupun menggunakan mgo.

Contoh Pertanyaan:

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
}

Soalan: Adakah terdapat sebab yang jelas untuk prestasi pertanyaan yang perlahan?

Petunjuk: Kaedah mgo.Dial() sedang dipanggil sebelum setiap pertanyaan.

Jawapan:

Ya, prestasi perlahan boleh dikaitkan dengan panggilan berulang ke mgo.Dial(). Kaedah ini mewujudkan sambungan ke pelayan MongoDB setiap kali, dan ia boleh mengambil masa beberapa ratus milisaat. Untuk menangani isu ini, buat pembolehubah sesi global, wujudkan sambungan sekali pada permulaan (cth., dalam fungsi pakej init() dan gunakan sesi itu (atau salinannya) untuk semua pertanyaan.

Penyelesaian:

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
}

Atas ialah kandungan terperinci Mengapa pertanyaan mgo saya mengambil masa 500-650ms untuk dilaksanakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn