mongo查询count很慢怎么办?

发布于 2022-09-07 03:28:31 字数 4569 浏览 24 评论 0

我使用mongodb3.4,目前有个查询需要做分页,分页需要返回总的数量和页数。
但问题就出在这里,分页查询还算快,但计数就特别慢

计数语句如下:

db.message.find(
    {
        "field_1":"ajian",
        "field_2":{ "$exists": true },
        "field_3":{ "$exists": true },
        "field_4":{ "$exists": true },
        "field_5":{"$regex":value1},
        "field_6":{"$regex":value2}
    }
).count()

返回结果要2秒5的时间!
我explain的info结果如下:

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "engine.message",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : [ 
                {
                    "field_1" : {
                        "$eq" : "ajian"
                    }
                }, 
                {
                    "field_2" : {
                        "$regex" : ""
                    }
                }, 
                {
                    "field_3" : {
                        "$regex" : "未处理"
                    }
                }, 
                {
                    "field_4" : {
                        "$exists" : true
                    }
                }, 
                {
                    "field_5" : {
                        "$exists" : true
                    }
                }, 
                {
                    "field_6" : {
                        "$exists" : true
                    }
                }
            ]
        },
        "winningPlan" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "$and" : [ 
                    {
                        "field_1" : {
                            "$eq" : "ajian"
                        }
                    }, 
                    {
                        "field_2" : {
                            "$regex" : ""
                        }
                    }, 
                    {
                        "field_3" : {
                            "$regex" : "未处理"
                        }
                    }, 
                    {
                        "field_4" : {
                            "$exists" : true
                        }
                    }, 
                    {
                        "field_5" : {
                            "$exists" : true
                        }
                    }, 
                    {
                        "field_6" : {
                            "$exists" : true
                        }
                    }
                ]
            },
            "direction" : "forward"
        },
        "rejectedPlans" : []
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 1537253,
        "executionTimeMillis" : 2536,
        "totalKeysExamined" : 0,
        "totalDocsExamined" : 1610191,
        "executionStages" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "$and" : [ 
                    {
                        "field_1" : {
                            "$eq" : "ajian"
                        }
                    }, 
                    {
                        "field_2" : {
                            "$regex" : ""
                        }
                    }, 
                    {
                        "field_3" : {
                            "$regex" : "未处理"
                        }
                    }, 
                    {
                        "field_4" : {
                            "$exists" : true
                        }
                    }, 
                    {
                        "field_5" : {
                            "$exists" : true
                        }
                    }, 
                    {
                        "field_6" : {
                            "$exists" : true
                        }
                    }
                ]
            },
            "nReturned" : 1537253,
            "executionTimeMillisEstimate" : 2417,
            "works" : 1610193,
            "advanced" : 1537253,
            "needTime" : 72939,
            "needYield" : 0,
            "saveState" : 12588,
            "restoreState" : 12588,
            "isEOF" : 1,
            "invalidates" : 0,
            "direction" : "forward",
            "docsExamined" : 1610191
        },
        "allPlansExecution" : []
    },
    "serverInfo" : {
        "host" : "secret",
        "port" : 27017,
        "version" : "3.4.10",
        "gitVersion" : "2234234232325323343"
    },
    "ok" : 1.0
}

为什么mongo的count计数这么慢呢?大神们在做分页的时候都怎么解决这个问题的?我这个问题又该怎么解决呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

隐诗 2022-09-14 03:28:31

简单地说,不能命中任何索引的查询需要进行全表扫描,这个过程当然是很慢的。你需要添加合适的索引。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文