草庐IT

MongoDb 查询需要很长时间

coder 2023-10-30 原文

我有一个收藏产品,里面有 ~7.000.000 本书和总共 ~40GB mongodb 3.4 数据库。这是一本书文档的示例:

{ 
    "_id" : ObjectId("597f17d22be7925d9a056e82"), 
    "ean13" : "9783891491904", 
    "price" : NumberInt(2100), 
    "name" : "My cool title", 
    "author_name" : "Doe, John", 
    "warengruppe" : "HC", 
    "book_category_key" : "728",
    "keywords": ["fairy tale", "magic", "fantasy"]
    ...
}

现在我想对产品集合进行一些文本搜索:

db.products.find({
    $text : {
        $search: '"harry" "potter" "3" lsxger' 
    }
}, {
    score: {
        "$meta": "textScore"
    },
    ean13: 1,
    name: 1,
    author_name: 1,
    price: 1,
    images: 1,
    warengruppe: 1
}).sort({
    score: {
        "$meta": "textScore"
    },
    name: 1
}).limit(9);

下面是解释的结果:

{ 
    "queryPlanner" : {
        "plannerVersion" : NumberInt(1), 
        "namespace" : "mydb.products", 
        "indexFilterSet" : false, 
        "parsedQuery" : {
            "$text" : {
                "$search" : "\"harry\" \"potter\" \"3\" lsxger", 
                "$language" : "german", 
                "$caseSensitive" : false, 
                "$diacriticSensitive" : false
            }
        }, 
        "winningPlan" : {
            "stage" : "PROJECTION", 
            "transformBy" : {
                "score" : {
                    "$meta" : "textScore"
                }, 
                "ean13" : 1.0, 
                "name" : 1.0, 
                "author_name" : 1.0, 
                "price" : 1.0, 
                "images" : 1.0, 
                "warengruppe" : 1.0
            }, 
            "inputStage" : {
                "stage" : "SORT", 
                "sortPattern" : {
                    "score" : {
                        "$meta" : "textScore"
                    }, 
                    "name" : 1.0
                }, 
                "limitAmount" : NumberInt(9), 
                "inputStage" : {
                    "stage" : "SORT_KEY_GENERATOR", 
                    "inputStage" : {
                        "stage" : "TEXT", 
                        "indexPrefix" : {

                        }, 
                        "indexName" : "fulltextsearch", 
                        "parsedTextQuery" : {
                            "terms" : [
                                "3", 
                                "harry", 
                                "lsxger", 
                                "pott"
                            ], 
                            "negatedTerms" : [

                            ], 
                            "phrases" : [
                                "harry", 
                                "potter", 
                                "3"
                            ], 
                            "negatedPhrases" : [

                            ]
                        }, 
                        "textIndexVersion" : NumberInt(3), 
                        "inputStage" : {
                            "stage" : "TEXT_MATCH", 
                            "inputStage" : {
                                "stage" : "TEXT_OR", 
                                "inputStages" : [
                                    {
                                        "stage" : "IXSCAN", 
                                        "keyPattern" : {
                                            "_fts" : "text", 
                                            "_ftsx" : NumberInt(1)
                                        }, 
                                        "indexName" : "fulltextsearch", 
                                        "isMultiKey" : true, 
                                        "isUnique" : false, 
                                        "isSparse" : false, 
                                        "isPartial" : false, 
                                        "indexVersion" : NumberInt(2), 
                                        "direction" : "backward", 
                                        "indexBounds" : {

                                        }
                                    }, 
                                    {
                                        "stage" : "IXSCAN", 
                                        "keyPattern" : {
                                            "_fts" : "text", 
                                            "_ftsx" : NumberInt(1)
                                        }, 
                                        "indexName" : "fulltextsearch", 
                                        "isMultiKey" : true, 
                                        "isUnique" : false, 
                                        "isSparse" : false, 
                                        "isPartial" : false, 
                                        "indexVersion" : NumberInt(2), 
                                        "direction" : "backward", 
                                        "indexBounds" : {

                                        }
                                    }, 
                                    {
                                        "stage" : "IXSCAN", 
                                        "keyPattern" : {
                                            "_fts" : "text", 
                                            "_ftsx" : NumberInt(1)
                                        }, 
                                        "indexName" : "fulltextsearch", 
                                        "isMultiKey" : true, 
                                        "isUnique" : false, 
                                        "isSparse" : false, 
                                        "isPartial" : false, 
                                        "indexVersion" : NumberInt(2), 
                                        "direction" : "backward", 
                                        "indexBounds" : {

                                        }
                                    }, 
                                    {
                                        "stage" : "IXSCAN", 
                                        "keyPattern" : {
                                            "_fts" : "text", 
                                            "_ftsx" : NumberInt(1)
                                        }, 
                                        "indexName" : "fulltextsearch", 
                                        "isMultiKey" : true, 
                                        "isUnique" : false, 
                                        "isSparse" : false, 
                                        "isPartial" : false, 
                                        "indexVersion" : NumberInt(2), 
                                        "direction" : "backward", 
                                        "indexBounds" : {

                                        }
                                    }
                                ]
                            }
                        }
                    }
                }
            }
        }, 
        "rejectedPlans" : [

        ]
    }, 
    "executionStats" : {
        "executionSuccess" : true, 
        "nReturned" : NumberInt(9), 
        "executionTimeMillis" : NumberInt(15441), 
        "totalKeysExamined" : NumberInt(1206999), 
        "totalDocsExamined" : NumberInt(1195069), 
        "executionStages" : {
            "stage" : "PROJECTION", 
            "nReturned" : NumberInt(9), 
            "executionTimeMillisEstimate" : NumberInt(15294), 
            "works" : NumberInt(2402085), 
            "advanced" : NumberInt(9), 
            "needTime" : NumberInt(2402075), 
            "needYield" : NumberInt(0), 
            "saveState" : NumberInt(18814), 
            "restoreState" : NumberInt(18814), 
            "isEOF" : NumberInt(1), 
            "invalidates" : NumberInt(0), 
            "transformBy" : {
                "score" : {
                    "$meta" : "textScore"
                }, 
                "ean13" : 1.0, 
                "name" : 1.0, 
                "author_name" : 1.0, 
                "price" : 1.0, 
                "images" : 1.0, 
                "warengruppe" : 1.0
            }, 
            "inputStage" : {
                "stage" : "SORT", 
                "nReturned" : NumberInt(9), 
                "executionTimeMillisEstimate" : NumberInt(15234), 
                "works" : NumberInt(2402085), 
                "advanced" : NumberInt(9), 
                "needTime" : NumberInt(2402075), 
                "needYield" : NumberInt(0), 
                "saveState" : NumberInt(18814), 
                "restoreState" : NumberInt(18814), 
                "isEOF" : NumberInt(1), 
                "invalidates" : NumberInt(0), 
                "sortPattern" : {
                    "score" : {
                        "$meta" : "textScore"
                    }, 
                    "name" : 1.0
                }, 
                "memUsage" : NumberInt(22949), 
                "memLimit" : NumberInt(33554432), 
                "limitAmount" : NumberInt(9), 
                "inputStage" : {
                    "stage" : "SORT_KEY_GENERATOR", 
                    "nReturned" : NumberInt(455), 
                    "executionTimeMillisEstimate" : NumberInt(15074), 
                    "works" : NumberInt(2402075), 
                    "advanced" : NumberInt(455), 
                    "needTime" : NumberInt(2401619), 
                    "needYield" : NumberInt(0), 
                    "saveState" : NumberInt(18814), 
                    "restoreState" : NumberInt(18814), 
                    "isEOF" : NumberInt(1), 
                    "invalidates" : NumberInt(0), 
                    "inputStage" : {
                        "stage" : "TEXT", 
                        "nReturned" : NumberInt(455), 
                        "executionTimeMillisEstimate" : NumberInt(15024), 
                        "works" : NumberInt(2402074), 
                        "advanced" : NumberInt(455), 
                        "needTime" : NumberInt(2401618), 
                        "needYield" : NumberInt(0), 
                        "saveState" : NumberInt(18814), 
                        "restoreState" : NumberInt(18814), 
                        "isEOF" : NumberInt(1), 
                        "invalidates" : NumberInt(0), 
                        "indexPrefix" : {

                        }, 
                        "indexName" : "fulltextsearch", 
                        "parsedTextQuery" : {
                            "terms" : [
                                "3", 
                                "harry", 
                                "lsxger", 
                                "pott"
                            ], 
                            "negatedTerms" : [

                            ], 
                            "phrases" : [
                                "harry", 
                                "potter", 
                                "3"
                            ], 
                            "negatedPhrases" : [

                            ]
                        }, 
                        "textIndexVersion" : NumberInt(3), 
                        "inputStage" : {
                            "stage" : "TEXT_MATCH", 
                            "nReturned" : NumberInt(455), 
                            "executionTimeMillisEstimate" : NumberInt(14974), 
                            "works" : NumberInt(2402074), 
                            "advanced" : NumberInt(455), 
                            "needTime" : NumberInt(2401618), 
                            "needYield" : NumberInt(0), 
                            "saveState" : NumberInt(18814), 
                            "restoreState" : NumberInt(18814), 
                            "isEOF" : NumberInt(1), 
                            "invalidates" : NumberInt(0), 
                            "docsRejected" : NumberInt(1194614), 
                            "inputStage" : {
                                "stage" : "TEXT_OR", 
                                "nReturned" : NumberInt(1195069), 
                                "executionTimeMillisEstimate" : NumberInt(4500), 
                                "works" : NumberInt(2402074), 
                                "advanced" : NumberInt(1195069), 
                                "needTime" : NumberInt(1207004), 
                                "needYield" : NumberInt(0), 
                                "saveState" : NumberInt(18814), 
                                "restoreState" : NumberInt(18814), 
                                "isEOF" : NumberInt(1), 
                                "invalidates" : NumberInt(0), 
                                "docsExamined" : NumberInt(1195069), 
                                "inputStages" : [
                                    {
                                        "stage" : "IXSCAN", 
                                        "nReturned" : NumberInt(59101), 
                                        "executionTimeMillisEstimate" : NumberInt(131), 
                                        "works" : NumberInt(59102), 
                                        "advanced" : NumberInt(59101), 
                                        "needTime" : NumberInt(0), 
                                        "needYield" : NumberInt(0), 
                                        "saveState" : NumberInt(18814), 
                                        "restoreState" : NumberInt(18814), 
                                        "isEOF" : NumberInt(1), 
                                        "invalidates" : NumberInt(0), 
                                        "keyPattern" : {
                                            "_fts" : "text", 
                                            "_ftsx" : NumberInt(1)
                                        }, 
                                        "indexName" : "fulltextsearch", 
                                        "isMultiKey" : true, 
                                        "isUnique" : false, 
                                        "isSparse" : false, 
                                        "isPartial" : false, 
                                        "indexVersion" : NumberInt(2), 
                                        "direction" : "backward", 
                                        "indexBounds" : {

                                        }, 
                                        "keysExamined" : NumberInt(59101), 
                                        "seeks" : NumberInt(1), 
                                        "dupsTested" : NumberInt(59101), 
                                        "dupsDropped" : NumberInt(0), 
                                        "seenInvalidated" : NumberInt(0)
                                    }, 
                                    {
                                        "stage" : "IXSCAN", 
                                        "nReturned" : NumberInt(9512), 
                                        "executionTimeMillisEstimate" : NumberInt(0), 
                                        "works" : NumberInt(9513), 
                                        "advanced" : NumberInt(9512), 
                                        "needTime" : NumberInt(0), 
                                        "needYield" : NumberInt(0), 
                                        "saveState" : NumberInt(18814), 
                                        "restoreState" : NumberInt(18814), 
                                        "isEOF" : NumberInt(1), 
                                        "invalidates" : NumberInt(0), 
                                        "keyPattern" : {
                                            "_fts" : "text", 
                                            "_ftsx" : NumberInt(1)
                                        }, 
                                        "indexName" : "fulltextsearch", 
                                        "isMultiKey" : true, 
                                        "isUnique" : false, 
                                        "isSparse" : false, 
                                        "isPartial" : false, 
                                        "indexVersion" : NumberInt(2), 
                                        "direction" : "backward", 
                                        "indexBounds" : {

                                        }, 
                                        "keysExamined" : NumberInt(9512), 
                                        "seeks" : NumberInt(1), 
                                        "dupsTested" : NumberInt(9512), 
                                        "dupsDropped" : NumberInt(0), 
                                        "seenInvalidated" : NumberInt(0)
                                    }, 
                                    {
                                        "stage" : "IXSCAN", 
                                        "nReturned" : NumberInt(1134940), 
                                        "executionTimeMillisEstimate" : NumberInt(1381), 
                                        "works" : NumberInt(1134941), 
                                        "advanced" : NumberInt(1134940), 
                                        "needTime" : NumberInt(0), 
                                        "needYield" : NumberInt(0), 
                                        "saveState" : NumberInt(18814), 
                                        "restoreState" : NumberInt(18814), 
                                        "isEOF" : NumberInt(1), 
                                        "invalidates" : NumberInt(0), 
                                        "keyPattern" : {
                                            "_fts" : "text", 
                                            "_ftsx" : NumberInt(1)
                                        }, 
                                        "indexName" : "fulltextsearch", 
                                        "isMultiKey" : true, 
                                        "isUnique" : false, 
                                        "isSparse" : false, 
                                        "isPartial" : false, 
                                        "indexVersion" : NumberInt(2), 
                                        "direction" : "backward", 
                                        "indexBounds" : {

                                        }, 
                                        "keysExamined" : NumberInt(1134940), 
                                        "seeks" : NumberInt(1), 
                                        "dupsTested" : NumberInt(1134940), 
                                        "dupsDropped" : NumberInt(0), 
                                        "seenInvalidated" : NumberInt(0)
                                    }, 
                                    {
                                        "stage" : "IXSCAN", 
                                        "nReturned" : NumberInt(3446), 
                                        "executionTimeMillisEstimate" : NumberInt(0), 
                                        "works" : NumberInt(3447), 
                                        "advanced" : NumberInt(3446), 
                                        "needTime" : NumberInt(0), 
                                        "needYield" : NumberInt(0), 
                                        "saveState" : NumberInt(18814), 
                                        "restoreState" : NumberInt(18814), 
                                        "isEOF" : NumberInt(1), 
                                        "invalidates" : NumberInt(0), 
                                        "keyPattern" : {
                                            "_fts" : "text", 
                                            "_ftsx" : NumberInt(1)
                                        }, 
                                        "indexName" : "fulltextsearch", 
                                        "isMultiKey" : true, 
                                        "isUnique" : false, 
                                        "isSparse" : false, 
                                        "isPartial" : false, 
                                        "indexVersion" : NumberInt(2), 
                                        "direction" : "backward", 
                                        "indexBounds" : {

                                        }, 
                                        "keysExamined" : NumberInt(3446), 
                                        "seeks" : NumberInt(1), 
                                        "dupsTested" : NumberInt(3446), 
                                        "dupsDropped" : NumberInt(0), 
                                        "seenInvalidated" : NumberInt(0)
                                    }
                                ]
                            }
                        }
                    }
                }
            }
        }, 
        "allPlansExecution" : [

        ]
    }, 
    "serverInfo" : {
        "host" : "lvps83-169-23-14.dedicated.hosteurope.de", 
        "port" : NumberInt(27017), 
        "version" : "3.4.4", 
        "gitVersion" : "888390515874a9debd1b6c5d36559ca86b44babd"
    }, 
    "ok" : 1.0
}

这大约需要 25 秒或更长时间。我已经为 book_category_key、ean13、author_name、name 和 fulltextsearch 设置了一些索引:

{ 
    "v" : 2, 
    "name" : "fulltextsearch", 
    "ns" : "mydb.products", 
    "background" : true, 
    "weights" : {
        "author_name" : 5, 
        "ean13" : 10, 
        "isbn" : 10, 
        "keywords" : 2, 
        "languages.search" : 8, 
        "mainsubject.name" : 3, 
        "name" : 10
    }, 
    "default_language" : "german", 
    "language_override" : "language_x", 
    "textIndexVersion" : 3
}

如何提高速度或到哪里寻找更多信息?

最佳答案

搜索耗时约 15 秒。

执行 TEXT_OR 搜索需要 4.5 秒

"stage" : "TEXT_OR", 
"nReturned" : NumberInt(1195069), 
"executionTimeMillisEstimate" : NumberInt(4500), 

剩下的 10 秒需要执行匹配

"stage" : "TEXT_MATCH", 
"nReturned" : NumberInt(455), 
"executionTimeMillisEstimate" : NumberInt(14974), //this includes the 4.5

text_or 匹配表明,必须检查 1.2 Mio 文档。这有一些含义:

  • 如果文档不在内存中,则从磁盘加载文档需要一段时间。由于您的总内存小于集合大小 (40GB) + 索引 (9GB),因此很有可能必须交换某些数据(您是否检查过连续搜索是否更快?)。 有两种选择:1. 减少索引大小(仅包括部分字段),2. 增加内存。尽管如此,获取文档只占总执行时间的 1/3。

  • 主要问题 (2/3) 是 ~1.2 Mio 文档上的文本匹配,这显然需要一段时间。所以你得想办法减少文档的数量(见下文)

可能有几种策略可以解决这个问题:

  • 您应该考虑使用带有附加条件的复合索引来限制总数(即仅在图书类别中搜索:“728”……不管是什么意思)(另请参见此处 Limit the Number of Entries Scanned)

  • 将索引限制为仅包含实际文本(名称、关键字、作者)的字段,并对其他类型(isbn、ean)使用专用索引。您的应用程序可以对用户输入进行有根据的猜测(根据格式测试它是否可能是 ean 或 isb 并为这些输入直接查找/正则表达式查找)。 这可能会有所帮助,尤其是因为“3”很可能会碰到几个完全不相关的 isbn 或 ean

  • 也许使用 AND 而不是 OR 来连接搜索词 ("\"harry potter 3\"") 也可能会加快这个过程,尽管它会改变搜索的语义.

  • 监控和分析常见搜索模式的实际用户搜索行为。因此,您可以优化实际使用模式(即添加一个包含常用搜索词的附加数组,并在数组字段上进行精确搜索,几秒钟后可以使用全文搜索结果对其进行细化)

关于MongoDb 查询需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45461015/

有关MongoDb 查询需要很长时间的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  3. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  4. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  5. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  6. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

  7. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  8. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

    我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

  9. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

    修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

  10. ruby - 可以正常中断的来自 Rake 的长时间运行的 shell 命令? - 2

    在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa

随机推荐