执行时间millis等于0 - MongoDB

时间:2015-08-03 16:37:40

标签: mongodb neo4j nosql

我使用了两个NOSQL数据库 MongoDB Neo4j 来处理相同的信息。我想使用第一个和第二个db来比较性能。我谈到了MongoDB in this question的问题:执行时间millis总是等于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 ,如您所见:
enter image description here

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

2 个答案:

答案 0 :(得分:5)

正如你回答的另一个问题所述。你的收藏太小了。这是我从一个超过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" : []
}

}

答案 1 :(得分:0)

我不确定比较非规范化的Mongo数据库是否公平,除非您正在讨论构建一个非常具体的用例,在此情况下您不会在您拥有的内容之上构建复杂性

也就是说,您希望自己熟悉Neo4j的密码中的PROFILEEXPLAIN命令(假设您使用的是2.2.x版)。这将有助于您了解Neo4j正在做什么。

如果您还没有,我希望您要做的一件事就是在_id标签的Team属性上创建一个索引,就像这样:

CREATE INDEX ON :Team(_id)

如果它是一个独特的属性,你可能想要创建一个约束(它会自动为你创建一个索引),如下所示:

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

如果您这样做,那么n1中的MATCH节点将能够使用索引直接转到您关心的磁盘上的节点,然后执行一些操作跳过PLAYS关系以获取其他节点。

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