MongoDB / Mongoose索引使查询更快或减慢?

我有这样的文章模型:

var ArticleSchema = new Schema({ type: String ,title: String ,content: String ,hashtags: [String] ,comments: [{ type: Schema.ObjectId ,ref: 'Comment' }] ,replies: [{ type: Schema.ObjectId ,ref: 'Reply' }] , status: String ,statusMeta: { createdBy: { type: Schema.ObjectId ,ref: 'User' } ,createdDate: Date , updatedBy: { type: Schema.ObjectId ,ref: 'User' } ,updatedDate: Date ,deletedBy: { type: Schema.ObjectId, ref: 'User' } ,deletedDate: Date ,undeletedBy: { type: Schema.ObjectId, ref: 'User' } ,undeletedDate: Date ,bannedBy: { type: Schema.ObjectId, ref: 'User' } ,bannedDate: Date ,unbannedBy: { type: Schema.ObjectId, ref: 'User' } ,unbannedDate: Date } }, {minimize: false}) 

当用户创build或修改article ,我将创build井号标签

 ArticleSchema.pre('save', true, function(next, done) { var self = this if (self.isModified('content')) { self.hashtags = helper.listHashtagsInText(self.content) } done() return next() }) 

例如,如果用户input"Hi, #greeting, i love #friday" ,我会在标签列表中存储['greeting', 'friday']

我想创build一个hashtags的索引,以更快地查询hashtags。 但从mongoose手册,我发现这一点:

当您的应用程序启动时,Mongoose将自动为您的模式中定义的每个索引调用ensureIndex。 Mongoose将依次为每个索引调用ensureIndex,并在所有ensureIndex调用成功或出现错误时在模型上发出“索引”事件。 尽pipe对开发很好,但build议在生产中禁用此行为,因为索引创build可能会对性能产生重大影响。 通过将模式的autoIndex选项设置为false来禁用此行为。

http://mongoosejs.com/docs/guide.html

那么mongoDB / Mongoose的索引速度会更快还是更慢呢?

另外,即使我创build索引像

  hashtags: { type: [String], index: true } 

我怎样才能使用我的查询索引? 或者,它会神奇地变得更快的正常查询,如:

  Article.find({hashtags: 'friday'}) 

你读错了

您在这里误读了引用块的意图,在那里.ensureIndex() (现在已经被弃用,但仍然被mongoose代码调用)在这里实际上是这样做的。

在mongoose中,您可以根据您的devise在模式或模式级别定义索引。 什么mongoose“自动”为你做了连接,它考虑到了每个注册模型,然后为提供的索引定义调用相应的.ensureIndex()方法。

这实际上是做什么的?

那么在大多数情况下,在您之前已经启动应用程序之后,运行.ensureIndexes()方法是绝对没有 。 这有点夸大其辞,但或多或​​less都是事实。

由于索引定义已经在服务器集合上创build,因此次级呼叫不会执行任何操作。 也就是说,它不会放弃索引和“重新创build”。 所以一旦索引本身被创build,真正的成本基本上是没有的。

创build索引

因此,由于mongoose只是标准API之上的一层,所以createIndex()方法包含了所发生的所有细节。

这里有一些细节需要考虑,比如索引构build可以在“后台”中进行,虽然这对于您的应用程序来说不那么干扰,但是它是以自己的代价来实现的。 值得注意的是,从“后台”生成的索引大小将比在前台构build索引大,阻止其他操作。

同样,所有的索引都是以成本为代价的,特别是在磁盘使用方面,以及在收集数据本身之外编写附加信息的额外成本。

索引的优势在于,对索引中包含的值进行“search”比查找整个集合并匹配可能的条件要快得多。

这些是与指标相关的基本“权衡”。

部署模式

回到文档中的引用块 ,这个build议背后有一个真实的意图。

这是典型的部署模式,特别是数据迁移按以下顺序进行:

  1. 将数据填充到相关的集合/表中
  2. 在与您的需求相关的收集/表格数据上启用索引

这是因为索引创build需要花费一些成本,正如前面提到的那样,从索引构build中获得最优化的大小是可取的,并且避免每个文档插入在写入索引条目时都有开销做这个“装”散装。

所以这就是索引的目的,这就是成本和收益,并解释mongoose文档中的信息。

一般来说,我build议阅读关于数据库索引的内容和内容。 想想走进图书馆找书。 入口处有一个卡片索引。 你在图书馆四处走动find你想要的书吗? 或者你在卡片索引中查找,find它在哪里? 这个索引花费了一些时间来创build并保持更新,但是这样可以节省“你”在整个图书馆里走动的时间,这样你就可以find你的书。