首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复杂的mongo查询运行起来相当慢,结合了$and $or $in和正则表达式

问复杂的mongo查询运行起来相当慢,结合了$and $or $in和正则表达式
EN

Stack Overflow用户
提问于 2015-01-30 09:20:11
回答 1查看 285关注 0票数 1

我正在对mongodb 2.4.9服务器运行一些查询,这些查询会填充网页上的datatable。用户需要能够跨多个字段进行子字符串搜索,对不同列上的数据进行排序,并在页面中翻阅结果。我必须检查多个字段的匹配项,因为用户可能正在搜索与文档相关的任何内容。集合中大约有300,000个文档,因此数据库相对较小。

我为created_by、requester、desc.name、metaprogram.id、program.id和arr.programid字段创建了索引。我还在Dex的建议下创建了索引[("created", 1), ("created_by", 1), ("requester", 1)]和[("created_by", 1), ("requester", 1)]。

值得一提的是,文档可能并不包含这里要搜索的所有字段。例如,有些文档可能有metaprogram.id,但没有其他ID字段。

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

代码语言:javascript
复制
{
    "$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毫秒。

我已经研究了如何让它更快,但没有能提出任何东西。有些文本搜索工具看起来很方便,但据我所知,每个集合最多只支持一个文本索引,并且不支持分页(跳过)。我确信前缀搜索而不是regex子串匹配也会更快,但我需要子串匹配。

你能想到什么方法来提高这样的查询速度吗?

EN

回答 1

Stack Overflow用户

发布于 2015-02-02 11:52:25

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

还要将返回的结果限制为50或100。用户不需要一次看到所有内容。

尝试升级mongodb,看看是否有性能提升。

附注:

您可能会考虑使用ElasticSearch作为搜索引擎,而不是Mongodb。ElasticSearch将存储可搜索字段并返回匹配结果的Mongodb。作为一个搜索引擎,ElasticSearch的速度比Mongodb快很多。

更多信息:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28227736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档