[MONGODB] MGO - 쿼리 성능이 느린 지속적으로 보인다 (500-650ms)
MONGODBMGO - 쿼리 성능이 느린 지속적으로 보인다 (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.예, 있습니다. 각 쿼리를 실행하기 전에 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... }
from https://stackoverflow.com/questions/40999637/mgo-query-performance-seems-consistently-slow-500-650ms by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를 데이터베이스에서 삭제 모든 (0) | 2019.12.08 |
---|---|
[MONGODB] 데이터베이스로 루씬 (또는 SOLR) 대되는 NoSQL (MongoDB를) (0) | 2019.12.08 |
[MONGODB] 옵션 검색 쿼리 매개 변수를 몽구스? (0) | 2019.12.08 |
[MONGODB] 어떻게되는 NoSQL 데이터베이스 (MongoDB의)에서 외래 키를 집행? (0) | 2019.12.08 |
[MONGODB] 정렬 된 페이징 주어진 레코드에 대한 값을 생략 계산 (0) | 2019.12.08 |