Javascript 检索大量文档时MongoDB速度非常慢(node+;mongoose+;express)
我的express应用程序需要列出我目前在mongo数据库中的用户数。当我要求少量用户(即约100个)时,这很好,但是如果我要求数万个用户,我开始看到响应时间的巨大延迟。例如,检索25000个用户大约需要19秒 在mongo中有这样的表现是正常的,还是我应该怀疑我在某处有bug 这是我的模型:Javascript 检索大量文档时MongoDB速度非常慢(node+;mongoose+;express),javascript,node.js,mongodb,mongoose,mean-stack,Javascript,Node.js,Mongodb,Mongoose,Mean Stack,我的express应用程序需要列出我目前在mongo数据库中的用户数。当我要求少量用户(即约100个)时,这很好,但是如果我要求数万个用户,我开始看到响应时间的巨大延迟。例如,检索25000个用户大约需要19秒 在mongo中有这样的表现是正常的,还是我应该怀疑我在某处有bug 这是我的模型: 'use strict'; // External modules const mongoose = require('mongoose'); const encrypt = require('mong
'use strict';
// External modules
const mongoose = require('mongoose');
const encrypt = require('mongoose-encryption');
const Schema = mongoose.Schema;
const UserSchema = new Schema({
uuid: {
type: String,
trim: true,
// TODO: test for unique uuid
index: { unique: true },
required: 'uuid cannot be blank'
},
createdOn: {
type: Date,
default: Date.now,
index: true
},
email: {
type: String,
trim: true,
required: 'email cannot be blank'
},
lists: [{
type: Schema.Types.ObjectId,
ref: 'List'
}]
});
UserSchema.index({ "lists" : 1 , "createdOn" : 1});
UserSchema.plugin(encrypt, { encryptionKey: process.env.EMAIL_ENCRYPTION_KEY, signingKey: process.env.EMAIL_SIGNING_KEY, encryptedFields: ['email'] });
mongoose.model('User', UserSchema);
我的问题是:
exports.list = (req, res) => {
let page = (Number(req.query.p) > 0 ? Number(req.query.p) : 1) - 1;
let perPage = (Number(req.query.pp) > 0 ? Number(req.query.pp) : 100);
res.header('X-Page', page + 1);
res.header('X-Per-Page', perPage);
User.count({}, (countErr, count) => {
res.header('X-Total-Count', count);
User.find({}, { __v: 0, createdOn: 0})
.sort({'createdOn': 1})
.limit(perPage)
.skip(perPage * page)
.exec((err, users) => {
if (err) {
return res.status(400).send({
message: err
});
}
else {
res.json(users);
}
});
});
};
分析时,
count()
操作大约需要52毫秒,因此,大部分时间都花在find()
查询上。阅读这篇@Skahrz,感谢您指出这一点。我认为我的查询要简单得多(加上我已经创建了{“list”:1,“createdOn”:1}索引,这是AFAIK查询中唯一使用的索引。那么您运行mongo的机器呢?@syymza Yea 5M有点多。您是否尝试过在没有Mongoose的情况下运行查询(排除Mongoose是瓶颈)?另外,尝试使用和/或。@robertklep哇,使用lean
将性能提高了一个数量级!阅读这篇@Skahrz感谢您指出这一点。我认为我的查询要简单得多(另外我创建了{“列表”:1,“createdOn”:1}索引,这是AFAIK查询中唯一使用的一个。您运行mongo的机器呢?@syymza yeah 5M有点多。您是否尝试过在没有Mongoose的情况下运行查询(以排除Mongoose是瓶颈)?另外,尝试使用和/或。@robertklep哇,使用lean
将性能提高了一个数量级!阅读这篇@Skahrz感谢您指出这一点。我认为我的查询要简单得多(另外我创建了{“列表”:1,“createdOn”:1}索引,这是AFAIK查询中唯一使用的一个。您运行mongo的机器呢?@syymza yeah 5M有点多。您是否尝试过在没有Mongoose的情况下运行查询(以排除Mongoose是瓶颈)?另外,尝试使用和/或。@robertklep Wow,使用lean
将性能提高一个数量级!