Mongodb 复杂的ish mongo查询运行速度相当慢,是$and$或$in和regex的组合

Mongodb 复杂的ish mongo查询运行速度相当慢,是$and$或$in和regex的组合,mongodb,mongodb-query,Mongodb,Mongodb Query,我正在运行一些对mongodb 2.4.9服务器的查询,该服务器在网页上填充数据表。用户需要能够跨多个字段进行子字符串搜索,对不同列上的数据进行排序,并在页面中浏览结果。我必须检查多个字段是否匹配,因为用户可能正在搜索与文档相关的任何内容。馆藏中约有30万份文档,因此数据库相对较小 我为创建的、请求者、desc.name、metaprogram.id、program.id和arr.programid字段创建了索引。我还创建了索引[(“创建”,1),(“创建人”,1),(“请求人”,1)]和[(“

我正在运行一些对mongodb 2.4.9服务器的查询,该服务器在网页上填充数据表。用户需要能够跨多个字段进行子字符串搜索,对不同列上的数据进行排序,并在页面中浏览结果。我必须检查多个字段是否匹配,因为用户可能正在搜索与文档相关的任何内容。馆藏中约有30万份文档,因此数据库相对较小

我为
创建的
请求者
desc.name
metaprogram.id
program.id
arr.programid
字段创建了索引。我还创建了索引
[(“创建”,1),(“创建人”,1),(“请求人”,1)]
[(“创建人”,1),(“请求人”,1)]

还值得一提的是,文档可能没有这里搜索的所有字段。例如,某些文档可能有一个
元程序.id
,但没有其他id字段

我可能运行的一个查询示例是

{
    "$query" : {
        "$and" : [
            {
                "created_by" : {"$ne" : "automation"},
                "requester" : {"$in" : ["Broadway", "Spec", "Falcon"] }
            },
            {
                "$or" : [
                    {"requester" : /month/i },
                    {"created_by" : /month/i },
                    {"desc.name" : /month/i },
                    {"metaprogram.id" : {"$in" : [708, 2314, 709 ] } },
                    {"program.id" : {"$in" : [708, 2314, 709 ] } },
                    {"arr.programid" : {"$in" : [708, 2314, 709 ] } }
                ]
            }
        ]
    },
    "$orderby" : {
        "created" : 1
    }
}
使用不同的
orderby
limit
skip

查询平均需要500-1500毫秒才能完成

我已经研究过如何使它更快,但还没有想出任何办法。有些文本搜索功能看起来很方便,但据我所知,每个集合最多只支持一个文本索引,不支持分页(跳过)。我确信前缀搜索而不是正则表达式子字符串匹配也会更快,但我需要子字符串匹配


有什么方法可以提高这样的查询速度吗?

当查询不可预测时,很难对其进行优化。 分析系统是如何使用的,并将索引放在最流行的字段上。 使用.explain()确保正在使用索引

还可以将返回的结果限制为50或100。用户不需要同时查看所有内容

尝试升级mongodb,看看是否有性能改进

旁注:

您可能想考虑使用弹性搜索作为搜索引擎而不是MunGDB。ElasticSearch将存储可搜索字段,并返回匹配结果的Mongodb ID。作为搜索引擎,ElasticSearch比Mongodb快了一个数量级

更多信息:

请勿使用skip和limit分页。按日期排序。看见我认为您需要不同的索引,但是,更确切地说,查看其中一个查询的解释会很有用。