Complex-ish mongo查询运行速度相当慢,$和$或$ in和regex的组合

时间:2015-01-30 01:20:11

标签: mongodb mongodb-query

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

我为created_byrequesterdesc.namemetaprogram.idprogram.idarr.programid字段创建了索引。我还根据Dex的建议创建了索引[("created", 1), ("created_by", 1), ("requester", 1)][("created_by", 1), ("requester", 1)]

还值得一提的是,文档可能没有在此搜索的所有字段。例如,某些文档可能有metaprogram.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
    }
}

也有不同的orderbylimitskip值。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

旁注:

您可能需要考虑将ElasticSearch用作搜索引擎而不是Mongodb。 ElasticSearch将存储可搜索的字段并返回Mongodb ID以获得匹配的结果。与Mongodb相比,ElasticSearch作为搜索引擎的速度要快得多。

更多信息: