猫鼬查询非常慢(即使精益)
Mongoose query is very slow (even with lean)
我正在使用 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是一个数组,其元素是文本.
中的单词
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 的免费层(因此没有分析器 and/or 性能分析),而且我还没有投入生产,所以我有没有生产环境可以在那里测试。另外,这个地区是比利时(europe-west1),这是离我最近的,但应该不会有太大的区别。
此外,我尝试删除 text_transform,因为我现在不一定需要它。差别不大。
编辑:
我忘了说,我实现了一个 returns 硬编码 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'
}
]
感谢您抽出时间阅读,也感谢您的提前帮助。
对于遇到同样问题的任何人。我怀疑它的 MongoDB 图集,确实如此。
我认为,查询速度慢的原因是 MongoDB Atlas 收到请求的速度很快,查询速度也很快,但返回结果的速度非常慢。这可能是一个过载,因为它是一个免费的 M0 沙盒包,使用共享服务器。我永远不会确切知道。另一方面,这很令人欣慰,因为在生产环境中,这种事情不应该发生。
TL;DR
出于开发目的,我切换到另一个免费 mongodb 提供商,所有内容都会立即加载。
我正在使用 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是一个数组,其元素是文本.
中的单词
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 的免费层(因此没有分析器 and/or 性能分析),而且我还没有投入生产,所以我有没有生产环境可以在那里测试。另外,这个地区是比利时(europe-west1),这是离我最近的,但应该不会有太大的区别。
此外,我尝试删除 text_transform,因为我现在不一定需要它。差别不大。
编辑:
我忘了说,我实现了一个 returns 硬编码 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'
}
]
感谢您抽出时间阅读,也感谢您的提前帮助。
对于遇到同样问题的任何人。我怀疑它的 MongoDB 图集,确实如此。
我认为,查询速度慢的原因是 MongoDB Atlas 收到请求的速度很快,查询速度也很快,但返回结果的速度非常慢。这可能是一个过载,因为它是一个免费的 M0 沙盒包,使用共享服务器。我永远不会确切知道。另一方面,这很令人欣慰,因为在生产环境中,这种事情不应该发生。
TL;DR
出于开发目的,我切换到另一个免费 mongodb 提供商,所有内容都会立即加载。