Rumah >pembangunan bahagian belakang >Golang >Mengapa pertanyaan mgo saya mengambil masa 500-650ms untuk dilaksanakan?
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!