当前位置: 首页 > 面试题库 >

mgo-查询性能似乎持续缓慢(500-650ms)

鲁展
2023-03-14
问题内容

我的数据层使用大量的Mongo聚合,平均而言,查询需要500-650毫秒才能返回。我正在使用mgo

下面显示了一个示例查询函数,该函数代表了我大部分查询的外观。

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
}

user我拥有的结构如下所示。

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?

我知道使用聚合管道可能会降低性能,但我不希望它这么糟糕。


问题答案:

..有什么明显的证据可以表明为什么我的查询器平均需要500-650ms?

就在这里。您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...
}


 类似资料:
  • 如果我试图缓存一个巨大的(例如:100GB表),当我对缓存的执行查询时,它会执行全表扫描吗?火花将如何索引数据。火花留档说: Spark SQL可以通过调用Spark,使用内存中的列格式缓存表。目录cacheTable(“tableName”)或dataFrame。缓存()。然后Spark SQL将只扫描所需的列,并将自动调整压缩以最小化内存使用和GC压力。你可以打电话给spark。目录uncac

  • 从select语句更新表时遇到问题...下面是命令: 我要传递给此查询的参数将是sub sub查询中的report_id...select单独执行需要0.113秒,而update查询总共需要4.868秒。是因为update查询将对表的每一行执行select语句吗?我怎么能让这更快? 谢谢你

  • 问题内容: 我正在尝试解决回文分割问题。您可以在https://leetcode.com/problems/palindrome- partitioning/中 找到问题。 我想出了解决方案: 但是性能很差。超过时间限制。 但是Python实现的相同想法可以通过: 这让我想知道如何改进swift的实现以及为什么swift的实现比python慢​​。 问题答案: Swift 是的集合,并且a 表示单

  • 我正在处理一个需要JDBC调用Oracle数据库的项目。我已经设置了UCP池化来与SpringJDBC一起工作。我有一个相当简单的查询,我正在执行如下... 我的java代码来设置这个查询看起来像下面... 只要数组中只有一个id,这一切都可以正常运行。当我添加第二个ID时,查询需要将近5分钟的时间运行。如果我获取精确的查询并在SQLDeveloper中执行它,则需要.093秒。 我的代码或配置一

  • 我遇到了一个奇怪的问题,我向你保证我已经谷歌了很多次。 谢谢

  • 我试图建立一个系统与实时流处理与flink具有s3作为源和弹性作为接收器。 我总共尝试了4个检查站案例。 只有一次,检查点对齐 使用未对齐的检查点执行一次 至少\u次,最多1个并发检查点 至少\u次,最多2个并发检查点 带有未对齐的检查点的Exactly\u Once似乎在向接收器发布时具有最小的延迟。 而其余三个的延迟似乎是相似的。 根据文档:At_Least_Once不应该在检查点期间阻塞一个