【问题标题】:Mongoose query is very slow (even with lean)猫鼬查询很慢(即使精益)
【发布时间】:2020-05-28 10:32:20
【问题描述】:

我正在使用 MongoDB,并且我在 Express 中使用 Mongoose 处理任何修改。 我认为查询应该更快。如果我错了,请纠正我,但虽然这个数据很大,但并不是那么大。特别是因为我在查询期间没有过滤或任何东西。

所以我使用的模型:

const DataSchema = mongoose.Schema({
  title: String,
  text: String,
  text_transform: Array,
  provider: String,
  url: {
    type: String,
    unique: true,
  },
  word_count: Array,
  HOW: Array,
  date: Date,
  click_count: Number,
}); 

一些基本事实:
文本大小可能会有所不同。可以是 150 个字符,但也可以是 7000 个字符……甚至更多(但通常少于 7000 个)。
text_transform 是一个数组,其元素是 text。
provider 是一个短字符串,我目前的最大长度是 12 个字符。
word_count 是一个数组键值对(数组)作为元素,如下所示:

[
   ["key", value], ["other_key", other_value], ...
]

值是数字,键是字符串。
HOW 是一个数组,最多包含 5 个元素,即字符串。约 6-10 个字符。

我有自己的 API,对某​​个端点的请求通常会触发查询。
我的问题在于尝试检索我的所有数据。

所以我向这个端点发送了一个请求:

router.get("/", async (req, res) => {
  try {
    const data = await DataSchema.find({}).lean();
    res.json(data);
  } catch (err) {
    res.status(404);
  }
});

如您所见,我已经使用 lean(),因为我可以使用简单的 json。
但是,当我在客户端进行查询时:
DevTools(F12) - Network
xhr request details
此时,我的数据库中有大约 270 个文档。

我不认为这可能是网络问题,因为当我将查询限制为前 10 个元素时,它会快得多,但仍然需要一秒钟左右,在我看来这非常慢。

有什么方法可以加快速度吗?

另外,您可能会感兴趣:对于开发,我使用的是 MongoDB Atlas 的免费层(所以没有分析器和/或性能分析),而且我还没有投入生产,所以我没有在那里测试的生产环境。此外,该地区是比利时 (europe-west1),这是离我最近的地区,但应该不会有太大的不同。

另外,我尝试删除 text_transform,因为我现在不需要它。差别不大。

编辑:

我忘了说,我实现了一个返回硬编码 json 的端点。这是在不到 1 毫秒的时间内完成的。所以这就是为什么我认为这里的查询很慢。

.explain() 结果

[
  {
    queryPlanner: {
      plannerVersion: 1,
      namespace: 'test.articles',
      indexFilterSet: false,
      parsedQuery: {},
      winningPlan: [Object],
      rejectedPlans: []
    },
    executionStats: {
      executionSuccess: true,
      nReturned: 301,
      executionTimeMillis: 0,
      totalKeysExamined: 0,
      totalDocsExamined: 301,
      executionStages: [Object],
      allPlansExecution: []
    },
    serverInfo: {
      host: 'some.database-shard.mongodb.net',
      port: 27017,
      version: '4.2.6',
      gitVersion: '20364840b8f1af16917e4c23c1b5f5efd8b352f8'
    },
    ok: 1,
    '$clusterTime': { clusterTime: '6831457389108002820', signature: [Object] },
    operationTime: '6831457389108002820'
  }
]

感谢您抽出宝贵时间阅读,并提前感谢您的帮助。

【问题讨论】:

  • 添加.eplxain() 并向我们展示结果请
  • 通过编辑添加它,以便任何人都能立即看到@Ifaruki
  • 嗯,它说,在 1 毫秒内创建了 301 个文档。我想问题出在你的服务器上
  • 好吧,当我执行 get 请求时,它只是从查询中返回 json,我将请求移到我的视图中,以确保中间没有任何东西,它仍然需要大约 30 秒。还有其他服务器端功能,但不应阻止此请求,否则测试端点也需要大约 30 秒。我还监视那些后台进程,GET 请求似乎没有“等待”任何东西。
  • 另外,我刚刚关闭了所有其他功能(只是为了确定)并且查询仍然需要大约 30 秒,我只能认为 MongoDB Atlas 可能存在一些问题?

标签: javascript mongodb express mongoose mongodb-atlas


【解决方案1】:

对于遇到同样问题的任何人。我怀疑它的 MongoDB Atlas,确实如此。

我认为查询慢的原因是 MongoDB Atlas 快速获取请求,查询快速但返回结果非常慢。这可能是一个过载,因为它是一个免费的 M0 沙盒包,使用共享服务器。我永远不会确切知道。另一方面,这很令人欣慰,因为在生产环境中这样的事情不一定会发生。

TL;DR

出于开发目的,我切换到了另一个免费的 mongodb 提供程序,一切都在瞬间加载。

【讨论】:

    猜你喜欢
    • 2013-08-24
    • 2016-03-29
    • 2019-07-04
    • 2017-12-26
    • 2018-01-10
    • 2020-06-02
    • 2012-02-03
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多