【问题标题】:Execution time millis equal to 0 - MongoDB执行时间毫秒等于 0 - MongoDB
【发布时间】:2015-08-03 16:37:40
【问题描述】:

我使用了两个 NOSQL 数据库,MongoDBNeo4j,来处理相同的信息。我想比较使用第一个和第二个数据库的性能。我谈到了我与 MongoDB in this question 的问题:执行时间毫秒总是等于 0。所以我在我的集​​合中添加了大约 250 个文档,但没有任何成功:

> db.team.find({common_name:"Milan"},{_id:0, "stadium.name":1}).explain("executionStats")

{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "Progettino.team",
                "indexFilterSet" : false,
                "parsedQuery" : {
                        "common_name" : {
                                "$eq" : "Milan"
                        }
                },
                "winningPlan" : {
                        "stage" : "PROJECTION",
                        "transformBy" : {
                                "_id" : 0,
                                "stadium.name" : 1
                        },
                        "inputStage" : {
                                "stage" : "COLLSCAN",
                                "filter" : {
                                        "common_name" : {
                                                "$eq" : "Milan"
                                        }
                                },
                                "direction" : "forward"
                        }
                },
                "rejectedPlans" : [ ]
        },
        "executionStats" : {
                "executionSuccess" : true,
                "nReturned" : 1,
                "executionTimeMillis" : 0,
                "totalKeysExamined" : 0,
                "totalDocsExamined" : 253,
                "executionStages" : {
                        "stage" : "PROJECTION",
                        "nReturned" : 1,
                        "executionTimeMillisEstimate" : 0,
                        "works" : 255,
                        "advanced" : 1,
                        "needTime" : 253,
                        "needFetch" : 0,
                        "saveState" : 0,
                        "restoreState" : 0,
                        "isEOF" : 1,
                        "invalidates" : 0,
                        "transformBy" : {
                                "_id" : 0,
                                "stadium.name" : 1
                        },
                        "inputStage" : {
                                "stage" : "COLLSCAN",
                                "filter" : {
                                        "common_name" : {
                                                "$eq" : "Milan"
                                        }
                                },
                                "nReturned" : 1,
                                "executionTimeMillisEstimate" : 0,
                                "works" : 255,
                                "advanced" : 1,
                                "needTime" : 253,
                                "needFetch" : 0,
                                "saveState" : 0,
                                "restoreState" : 0,
                                "isEOF" : 1,
                                "invalidates" : 0,
                                "direction" : "forward",
                                "docsExamined" : 255
                        }
                }
        }


例如在 MongoDB 中,这个查询会比在 Neo4j 中工作得更好,因为我使用了非规范化模型来表示有关球队体育场的信息。事实上,在 Neo4j 中,这个查询需要 50 ms,如您所见:

那么,我可以做些什么来获得有关 MongoDB 中执行时间毫秒的信息?如果执行时间毫秒总是等于 0,我会遇到一些问题,因为我无法在使用两个不同的 NoSQL DB 的相同查询上显示不同的性能。

【问题讨论】:

    标签: mongodb neo4j nosql


    【解决方案1】:

    正如您在我回答的其他问题中所述。你的收藏太少了。这是我从包含超过 3K 个项目的数据库中获得的输出。请注意,我的 executionTimeInMillis 只有 2 毫秒。您将需要更多数据才能使 mongo 真正流失。根据您机器的大小,说出 10K 多条记录。

    {
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "arenas.arenas",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : []
        },
        "winningPlan" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "$and" : []
            },
            "direction" : "forward"
        },
        "rejectedPlans" : []
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 3718,
        "executionTimeMillis" : 2,
        "totalKeysExamined" : 0,
        "totalDocsExamined" : 3718,
        "executionStages" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "$and" : []
            },
            "nReturned" : 3718,
            "executionTimeMillisEstimate" : 0,
            "works" : 3724,
            "advanced" : 3718,
            "needTime" : 1,
            "needFetch" : 4,
            "saveState" : 31,
            "restoreState" : 31,
            "isEOF" : 1,
            "invalidates" : 0,
            "direction" : "forward",
            "docsExamined" : 3718
        },
        "allPlansExecution" : []
    }
    

    }

    【讨论】:

    • 好的,谢谢。我编写了一个 java 程序来自动将 100k+ 文档添加到我的集合中。现在我可以轻松比较查询了。
    【解决方案2】:

    我不确定比较非规范化的 Mongo DB 是否公平,除非您正在谈论构建一个非常具体的用例,在该用例中您永远不会在现有的基础上构建复杂性。

    也就是说,您需要熟悉 Neo4j 密码中的 PROFILEEXPLAIN 命令(假设您使用的是 2.2.x 版本)。这将帮助您了解 Neo4j 在做什么。

    我希望您想要做的一件事(如果您还没有做的话)是在 Team 标签的 _id 属性上创建一个索引,如下所示:

    CREATE INDEX ON :Team(_id)
    

    如果它是一个独特的属性,您可能希望像这样创建一个约束(它会自动为您创建一个索引):

    CREATE CONSTRAINT ON (n:Team) ASSERT n._id IS UNIQUE
    

    如果您这样做,那么您的 MATCH 中的 n1 节点将能够使用索引直接转到您关心的磁盘上的节点,然后跨 @ 987654329@ 关系来获取那些其他节点。

    另外,同意您应该尝试使用更多数据进行测试;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      • 2023-03-11
      • 2021-12-31
      • 2022-12-07
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多