mgo - query performance seems consistently slow (500-650ms)

前端 未结 1 642
北荒
北荒 2020-11-28 15:39

My data layer uses Mongo aggregation a decent amount, and on average, queries are taking 500-650ms to return. I am using mgo.

A sample query function is

相关标签:
1条回答
  • 2020-11-28 16:20

    .. is there anything obvious that would suggest why my queriers are averaging 500-650ms?

    Yes, there is. You are calling mgo.Dial() before executing each query. mgo.Dial() has to connect to the MongoDB server every time, which you close right after the query. The connection may very likely take hundreds of milliseconds to estabilish, including authentication, allocating resources (both at server and client side), etc. This is very wasteful.

    This method is generally called just once for a given cluster. Further sessions to the same cluster are then established using the New or Copy methods on the obtained session. This will make them share the underlying cluster, and manage the pool of connections appropriately.

    Create a global session variable, connect on startup once (using e.g. a package init() function), and use that session (or a copy / clone of it, obtained by Session.Copy() or Session.Clone()). For example:

    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()
    
        // Now we use sess to execute the query:
        var user User
        c := sess.DB(info.Db()).C("users")
        // Rest of the method is unchanged...
    }
    
    0 讨论(0)
提交回复
热议问题