mgo - 查询性能似乎一直很慢(500-650 毫秒)

2024-02-28

我的数据层大量使用 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
}

The 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-650 毫秒?

我知道使用聚合管道可能会对性能造成一些影响,但我没想到会这么糟糕。


..有什么明显的事情可以表明为什么我的查询器平均为 500-650 毫秒吗?

就在这里。你正在呼唤mgo.Dial() https://godoc.org/gopkg.in/mgo.v2#Dial在执行每个查询之前。mgo.Dial()每次都必须连接到 MongoDB 服务器,您在查询后立即关闭该服务器。连接很可能需要数百毫秒才能建立,包括身份验证、分配资源(服务器端和客户端)等。这是非常浪费的。

对于给定的集群,此方法通常只调用一次。然后,在获得的会话上使用“新建”或“复制”方法建立与同一集群的更多会话。这将使它们共享底层集群,并适当地管理连接池。

创建全局会话变量,启动时连接once(例如使用包init()函数),并使用该会话(或其副本/克隆,通过以下方式获得)Session.Copy() https://godoc.org/gopkg.in/mgo.v2#Session.Copy or Session.Clone() https://godoc.org/gopkg.in/mgo.v2#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...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mgo - 查询性能似乎一直很慢(500-650 毫秒) 的相关文章

随机推荐

  • 使用 e.stopPropagation() 防止事件冒泡的优点和缺点

    很多人都解释过e stopPropagation 防止事件冒泡 然而 我很难找到why人们首先想要或想要阻止事件冒泡 在我的网站上 我有许多元素 其名称如下 document body on click clickable function
  • 在 pandas 中加载带有二进制数据的 CSV 文件

    我正在尝试解析 CSV 文件 来自外部数据源 其中其中一列使用不一致的字符编码 我不想尝试让数据提供者使用一致的编码 而是只想将该列读取为二进制数据 然而 pandas read csv似乎在解析之前将整个文件解码为字符串 所以这给了我错误
  • 正则表达式包含某些单词但排除另一个单词

    我正在尝试编写一个正则表达式 它将检查 URL 是否包含某些单词并排除另一个单词 原因是我正在尝试跟踪通过我的网站的流量 并且我不想计算点击 谢谢 页面的任何人 例如 http www mywebsite com register now
  • 将字符串编码为字符代码

    我想将电子邮件地址编码为其相应的字符代码 因此在打印时 浏览器会解释字符代码 但机器人会获取编码的字符串而不是解释的字符串 例如 1 email protected cdn cgi l email protection 应按 2 发送到浏览
  • 鼠标悬停在 safari、selenium web 驱动程序中不起作用

    我在 FF 和 chrome 中使用鼠标悬停操作 它工作正常 但同样的代码在 safari 中不起作用 我正在使用 mac OS 和 selenium webdriver 和 java 我尝试了下面的代码 new Actions drive
  • 我可以向通过 MQTT WebSocket 连接的一组 Azure IoT 中心设备发送消息吗?

    Goal 将消息发送到一组通过 MQTT WebSocket 连接的 Azure IoT 中心设备 初步想法 让一组 IoT 中心设备 组 X 订阅主题 X 的消息 Problem On the 使用 MQTT 协议与 IoT 中心通信 h
  • 如何使用 watir-scroll 在表格内滚动

    我有一个应用程序 其中有一个动态表 仅当您向上或向下滚动时才会加载行 Watir scroll 正在滚动整个页面 我可以在该表中执行滚动吗 使元素可滚动通常是通过设置overflow风格 它很可能在一个div其中包含table 例如 div
  • C++ 仅标头包含模式

    我想在 hpp 中编写代码 而不将 h 和 cpp 分开 我做到了 我仅将 cpp 用于静态类字段定义 我不想手动编写 include 如果可能的话 我使用前向声明 我的每个 hpp 文件都包含 pragma 一次 但是 当我的项目增长到
  • Java:转换原始类[重复]

    这个问题在这里已经有答案了 Java中有没有一种简单的方法可以将原始类对象转换为对象类对象 给定一个类 Class cl 我想将其转换为没有基元的类 例如 Class
  • 在属性中实现逻辑是一个好习惯吗

    我们将 ASP NET 与 C 结合使用 根据我浏览过的开源项目 文章 我发现许多属性都包括logic但是当我这样做时 团队负责人告诉我 将逻辑放在属性中根本不好 而是通过方法调用逻辑 那真的很糟糕吗 为什么不在属性中使用逻辑 thanks
  • 关于Python的函数教程中的斐波那契数列示例

    这是什么they http docs python org 2 tutorial controlflow html have def fib n a b 0 1 while a lt n print a a b b a b 这就是我所拥有的
  • 如何将斯皮尔曼相关性 p 值以及相关系数添加到 ggpairs 中?

    使用以下代码在 R 中构建 ggpairs 图形 df 是一个数据帧 包含 6 个连续变量和 1 个Group多变的 ggpairs df 1 columns 1 ncol df 1 mapping ggplot2 aes colour d
  • 补偿 SOA 中继承不足的模式

    我发现继承和基类的概念是 OOP 的最强点 但 SOA 并不鼓励这样做 那么 克服 SOA 中这一限制的流行模式是什么 您能否提供解释这些模式的教程 在 WCF 中提供代码演示 注意 这不是关于 SOA 中可用模式的一般问题 但它更具体地针
  • OpenGL中glActiveTexture和GL_TEXTURE0的作用是什么?

    我正在寻找一种方法来理解原因glActiveTexture是需要的 我有下面的代码 glGenTextures 1 textureId glBindTexture GL TEXTURE 2D textureId 如果我想象的是GL TEXT
  • 如何从函数返回数组?

    如何从方法返回数组 以及必须如何声明它 int test void int test 但使用向量会 更C std vector lt int gt test EDIT我会澄清一些问题 既然你提到了C 我就选择new and delete 运
  • 多处理池示例不起作用并冻结内核

    我正在尝试并行化脚本 但由于未知原因 内核只是冻结而没有抛出任何错误 最小工作示例 from multiprocessing import Pool def f x return x x p Pool 6 print p map f ran
  • 似乎没有为 __doPostBack 发出正确的 GridView 标记

    I asked 这个问题 https stackoverflow com questions 4852474 asp net gridview update button fires edit event handler关于 ASP Net
  • 存储 mysql_connect 的 php 值的最安全位置?

    存储将在 mysql connect 中使用的值的最安全位置是什么 调用这些变量的最安全方法是什么 使用 require include 或其他东西会更好吗 谢谢 IMO 存储它的最佳位置是 PHP 文件 无论您使用require or i
  • 为什么 Response.Redirect 会导致 System.Threading.ThreadAbortException?

    当我使用 Response Redirect 将表单重定向到新页面时 出现错误 mscorlib dll 中发生了 System Threading ThreadAbortException 类型的第一次机会异常mscorlib dll 中
  • mgo - 查询性能似乎一直很慢(500-650 毫秒)

    我的数据层大量使用 Mongo 聚合 平均而言 查询需要 500 650 毫秒才能返回 我在用mgo 下面显示了一个示例查询函数 它代表了我的大多数查询的样子 func r userRepo GetUserByID id string Us