복붙노트

[MONGODB] MGO - 쿼리 성능이 느린 지속적으로 보인다 (500-650ms)

MONGODB

MGO - 쿼리 성능이 느린 지속적으로 보인다 (500-650ms)

내 데이터 계층은 상당한 금액 집계 몽고를 사용하고, 평균 쿼리가 반환하는 500-650ms을하고있다. 나는 산화 마그네슘을 사용하고 있습니다.

샘플 쿼리 기능은 내 쿼리의 대부분의 모양을 나타내는 다음과 같습니다.

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
}

사용자는 나는 다음과 같은 외모를 가지고 구조체 ..

type User struct {
    ID             string        `json:"id" bson:"_id,omitempty"`
    First          string        `json:"first" bson:"first"`
    Last           string        `json:"last" bson:"last"`
    Email          string        `json:"email" bson:"email"`
    FacebookID     string        `json:"facebook_id" bson:"fb_id,omitempty"`
    Groups         []UserGroup   `json:"groups" bson:"groups"`
    Requests       []Request     `json:"requests" bson:"requests"`
    Fulfillments   []Fulfillment `json:"fulfillments" bson:"fulfillments"`
    Invites        []GroupInvite `json:"invites" bson:"invites"`
    DeniedRequests []string      `json:"denied_requests" bson:"denied_requests"`
}

내가 제공 한 내용을 바탕으로, 내 쿼리 500-650ms을 평균하는 이유를 건의 할 것입니다 분명이 무엇입니까?

나는 아마 통합 파이프 라인을 사용하여 성능 저하의 비트를 삼키는하고 있음을 알고 있지만, 나는이 나쁜 기대하지 않을 것이다.

해결법

  1. ==============================

    1.예, 있습니다. 각 쿼리를 실행하기 전에 mgo.Dial ()를 호출한다. mgo.Dial ()는 MongoDB를 서버에 때마다, 당신은 가까운 직후 쿼리를 연결할 수 있습니다. 연결은 가능성이 매우 낭비 등 (서버 및 클라이언트 측 모두) 자원을 할당, 인증을 포함한 기형 중 밀리 초, 수백 걸릴 수 있습니다.

    예, 있습니다. 각 쿼리를 실행하기 전에 mgo.Dial ()를 호출한다. mgo.Dial ()는 MongoDB를 서버에 때마다, 당신은 가까운 직후 쿼리를 연결할 수 있습니다. 연결은 가능성이 매우 낭비 등 (서버 및 클라이언트 측 모두) 자원을 할당, 인증을 포함한 기형 중 밀리 초, 수백 걸릴 수 있습니다.

    글로벌 세션 변수를 작성 (예를 들어, 패키지의 init () 함수를 사용하여) 후에 시동에 연결하고 (Session.Copy () 또는 Session.Clone ()에 의해 얻어진 또는 사본 / 클론) 세션을 사용한다. 예를 들면 :

    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...
    }
    
  2. from https://stackoverflow.com/questions/40999637/mgo-query-performance-seems-consistently-slow-500-650ms by cc-by-sa and MIT license