我在一个集合中添加了索引。第一次查询比没有索引的查询要慢。后续查询比没有索引的查询要快,这是有道理的。
我想知道为什么会出现这种情况,是因为索引需要从磁盘读取到内存吗?更难理解的是,我删除了索引,重启了mongod,再次创建索引时速度很快,不像第一次那样慢。如果我重新启动计算机,则带索引的第一次查询会变得很慢。
有人能清楚地解释这种行为吗?
接下来,我提供一些关于文档、索引和查询信息的资料。集合中的文档如下:
重新使用其他永久链接来重新运行相同的查询,以避免从内存中获取该查询(或类似操作)。此过程只需0毫秒:
我想知道为什么会出现这种情况,是因为索引需要从磁盘读取到内存吗?更难理解的是,我删除了索引,重启了mongod,再次创建索引时速度很快,不像第一次那样慢。如果我重新启动计算机,则带索引的第一次查询会变得很慢。
有人能清楚地解释这种行为吗?
接下来,我提供一些关于文档、索引和查询信息的资料。集合中的文档如下:
> db.posts.findOne()
{
"_id" : ObjectId("557d73e1fab73211b00f3080"),
"title" : "aaa",
"author" : "nuevo",
"body" : "aaa",
"permalink" : "aaa",
"tags" : [
"a"
],
"comments" : [ ],
"date" : ISODate("2015-06-14T12:30:25.733Z")
}
集合的大小:
> db.posts.find().count()
1008
没有索引的查询,需要3毫秒(我没有放出explain的所有输出,只有相关部分):
> db.posts.explain("executionStats").find({ permalink: "ambzrbxvnorazgnqvzbw"});
{
....
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 3,
"totalKeysExamined" : 0,
"totalDocsExamined" : 1008,
....
}
创建索引:
> db.posts.createIndex({permalink:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 3,
"numIndexesAfter" : 4,
"ok" : 1
}
使用已创建的索引进行查询(71毫秒):
> db.posts.explain("executionStats").find({ permalink: "ambzrbxvnorazgnqvzbw"});
{
....
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 71,
"totalKeysExamined" : 1,
"totalDocsExamined" : 1,
....
}
重新使用其他永久链接来重新运行相同的查询,以避免从内存中获取该查询(或类似操作)。此过程只需0毫秒:
> db.posts.explain("executionStats").find({ permalink: "orrjnueekntvjegzvbjk"});
{
....
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 0,
"totalKeysExamined" : 1,
"totalDocsExamined" : 1,
....
}