Golang Go语言中 mongodb mgo 封装 query 查询慢,请教

db:statistics collection:uart_logs 32w 条数据,每条多层文档结构 serial_server 字段 asc 索引

手写 query db.uart_logs.find({serial_server:"10.30.40.233"}).limit(1) 查询时间 0.75s mgo 封装后 query db.uart_logs.find({ find: "uart_logs", filter: { serial_server: "10.30.40.233" }, limit: 1 , $db: "statistics" }) 查询时间 23s 这样子手写 db.collection.find({ find: "uart_logs", filter: { serial_server: "10.30.40.233" }, limit: 1 , $db: "statistics" }) 也是 1s 内

mongodb log

2022-11-07T14:39:15.592+0800 I COMMAND [conn6] command statistics.uart_logs command: find { find: "uart_logs", filter: { serial_server: "10.30.37.233", time: new Date(1667800800000) }, limit: 1, singleBatch: true, lsid: { id: UUID("934fd6f4-3e07-4697-b381-5e329799fbf2") }, $db: "statistics" } planSummary: COLLSCAN keysExamined:0 docsExamined:326818 cursorExhausted:1 numYields:2588 nreturned:1 queryHash:589B9D08 planCacheKey:589B9D08 reslen:61527 locks:{ ReplicationStateTransition: { acquireCount: { w: 2589 } }, Global: { acquireCount: { r: 2589 } }, Database: { acquireCount: { r: 2589 } }, Collection: { acquireCount: { r: 2589 } }, Mutex: { acquireCount: { r: 1 } } } storage:{ data: { bytesRead: 916177929, timeReadingMicros: 572959 }, timeWaitingMicros: { cache: 20 } } protocol:op_msg 12574ms

请问各位大佬什么原因


Golang Go语言中 mongodb mgo 封装 query 查询慢,请教

更多关于Golang Go语言中 mongodb mgo 封装 query 查询慢,请教的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

远程 mongodump 三个小时 这 32w 条数据还没 dump 下来

更多关于Golang Go语言中 mongodb mgo 封装 query 查询慢,请教的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


sorry 搞错了,用的官方推荐的 go.mongodb.org/mongo-driver/mongo

向大佬学习

大概率是没加索引

db.uart_logs.getIndexes()

找到原因了,测试了下,用的 go 连接器,默认连接上了 col 集合,然后用集合的连接池,再去查其他集合就会出现无索引,几十万全部扫描。
后面改为直连接库,然后根据实际使用再连接 col 集合查询就没这个问题了,感谢提醒

一般出现这种 slow query 的问题,首先考虑是不是索引没加,如果加了没使用,要么是 query 写法问题,要么是代码错误。主流数据库发展这么多年了,大小问题都优化过了,所以出问题首先怀疑自己代码通常是正解😂

在Golang中使用mgo库对MongoDB进行封装时,如果遇到查询慢的问题,可以从以下几个方面进行排查和优化:

  1. 索引优化

    • 确保在查询中使用的字段上建立了合适的索引。可以通过MongoDB的db.collection.getIndexes()查看现有索引。
    • 对于复合查询,考虑创建复合索引。
  2. 查询优化

    • 简化查询条件,避免不必要的复杂逻辑。
    • 使用Explain()方法分析查询计划,了解查询的执行情况和性能瓶颈。
    • 尽量避免全表扫描,确保查询条件能够利用索引。
  3. 连接池管理

    • 检查mgo的连接池配置,确保连接池大小足够,避免连接创建和销毁的开销。
    • 监控连接池的使用情况,确保没有连接泄漏。
  4. 代码优化

    • 确保在查询前已经正确设置了MongoDB的连接和数据库。
    • 避免在查询过程中进行不必要的计算或IO操作。
    • 使用并发查询(如goroutine)来提高查询效率,但注意并发数不要过高,以免压垮MongoDB服务器。
  5. 硬件和配置

    • 检查MongoDB服务器的硬件资源(如CPU、内存、磁盘IO)是否足够。
    • 调整MongoDB的配置参数,如oplogSizejournaling等,以优化性能。

通过上述步骤,通常可以定位并解决查询慢的问题。如果问题依旧存在,可能需要更深入地分析查询日志或考虑使用更高效的数据库查询框架。

回到顶部