sql >> Base de Datos >  >> NoSQL >> MongoDB

mgo:el rendimiento de las consultas parece constantemente lento (500-650 ms)

... ¿hay algo obvio que sugiera por qué mis consultas tienen un promedio de 500-650 ms?

Sí hay. Estás llamando a mgo.Dial() antes de ejecutar cada consulta. mgo.Dial() tiene que conectarse al servidor MongoDB cada vez, que cierra justo después de la consulta. Es muy probable que la conexión tarde cientos de milisegundos en establecerse, incluida la autenticación, la asignación de recursos (tanto en el servidor como en el lado del cliente), etc. Esto es un gran desperdicio.

Este método generalmente se llama solo una vez para un clúster determinado. A continuación, se establecen más sesiones en el mismo clúster utilizando los métodos Nuevo o Copiar en la sesión obtenida. Esto hará que compartan el clúster subyacente y administren el conjunto de conexiones de manera adecuada.

Cree una variable de sesión global, conéctese al inicio una vez (usando, por ejemplo, un paquete init() función), y use esa sesión (o una copia / clon de ella, obtenida por Session.Copy() o Session.Clone() ).Por ejemplo:

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...
}