【问题标题】:Complex-ish mongo query runs fairly slow, combination of $and $or $in and regex复杂的 mongo 查询运行相当慢,$ 和 $ 或 $in 和正则表达式的组合
【发布时间】:2015-03-29 10:44:21
【问题描述】:

我正在对 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 毫秒才能完成。

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

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

【问题讨论】:

  • 不要使用跳过和限制进行分页。使用日期排序。见stackoverflow.com/questions/20960815/…。我认为您需要不同的索引,但更重要的是,查看其中一个查询的解释会很有用。

标签: mongodb mongodb-query


【解决方案1】:

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

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

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

旁注:

您可能需要考虑使用 ElasticSearch 作为搜索引擎而不是 Mongodb。 ElasticSearch 将存储可搜索的字段并返回 Mongodb Id 以获得匹配的结果。作为搜索引擎,ElasticSearch 比 Mongodb 快一个数量级。

更多信息:

【讨论】:

    猜你喜欢
    • 2019-06-03
    • 2015-01-20
    • 1970-01-01
    • 2019-09-30
    • 2019-02-27
    • 1970-01-01
    • 2014-10-08
    • 2010-11-18
    • 2015-02-21
    相关资源
    最近更新 更多