【问题标题】:MongoDB, Mongoose - Slow query when fetching 10k+ documentsMongoDB,Mongoose - 获取 10k+ 文档时查询缓慢
【发布时间】:2016-01-11 06:58:21
【问题描述】:

我有一个 MongoDB 数据库,其中包含 10-12k 个文档,并且在尝试获取所有文档时遇到非常慢的查询,如下所示:

Sales.find()
    .where('author').equals(author)
    .where('date').gt(startDate.unix()).lt(endDate.unix())
    .exec(function(err, results) {
        callback();
    });

此查询获取大约 10.5k 文档,执行时间为 1000-1300 毫秒。我尝试删除“where”条件 - 它只会让它变慢(获取更多文档?)。

问题是来自 Mongoose、MongoDB、JavaScript 还是 Node?我曾经运行 PHP/MySQL 数据库,在类似的条件下它的速度要快 10-20 倍,比如获取 10k+ 行数据。我做错了什么?

编辑

销售模式:

var salesSchema = new Schema({
    author: String,
    kind: String,
    productID: String,
    description: String,
    date: String,
    amount: String,
    transactionID: {
        type: String,
        unique : true
    }
});

来自 RoboMongo 桌面客户端的查询结果:

db.getCollection('sales').find({}).explain()

executionTimeMillis: 46
nReturned: 10359

【问题讨论】:

  • 您能否编辑您的问题以包含 Sales 模型的架构定义、基础集合上的任何索引、mongo shell db.collection.find() 方法的 .explain() 查询计划的输出示例查询?
  • 是的,我会这样做的,谢谢!
  • 我可以看到date 是一个字符串,但你的猫鼬Sales.find() 方法正在基于一个整数的unix时间戳字段进行日期范围查询,看起来你也没有date 字段上定义的任何索引,因此 mongodb 可能正在执行完整的集合扫描。您还可以添加来自db.getCollection('sales').find({author: author, date {gt: startDate, lt: endDate }}).explain() 的输出吗?
  • 我觉得有些不对劲。 "db.getCollection('sales').find({author: 'nickys', date: {gt: '1325336400', lt: '1420030800' }}).explain()" 不返回任何结果。我尝试从时间戳中删除引号,但没有帮助。如果我删除整个日期条件,它会起作用。原谅我,我是 Mongo 的新手 :)
  • 当我再次运行测试时,我将阅读有关这些索引的更多信息并更新帖子。谢谢!

标签: node.js mongodb mongoose


【解决方案1】:

问题来自猫鼬。默认情况下,find() 会将文档返回为 Mongoose Documents,这会花费很多。通过在查询中添加lean(),文档以纯JavaScript 对象的形式返回,对于10k+ 返回文档的这种情况,查询时间减少了3-5 倍

Sales.find()
    .where('author').equals(author)
    .where('date').gt(startDate.unix()).lt(endDate.unix())
    .lean()
    .exec(function(err, results) {
        callback();
    });

在这里阅读更多: http://www.tothenew.com/blog/high-performance-find-query-using-lean-in-mongoose-2/

【讨论】:

  • 谢谢你拯救了我的一天!
  • 如果你有超过 100k+ 并且已经设置了 lean() 但仍然需要很长时间?
  • 在 33000 毫秒到 5000 毫秒的时间内与我们合作,处理 70k 个文档
猜你喜欢
  • 2020-12-04
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 2020-06-25
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
相关资源
最近更新 更多