const result = await strapi.query("model").find({
id: id,
_start: page > 0 ? (page - 1) * pageSize : 0,
_limit: pageSize,
_sort: "created_at:desc",
});假设我们有这个strapi查询并使用MongoDB。没有分页的初始查询需要15秒,使用分页可以提高性能吗?我认为不行,因为MongoDB仍然需要查看所有的记录。MongoDB是否进行了性能优化?如果有的话,我想如果在聚合过程中执行联接也没关系,因为您仍然需要查看所有记录,因此性能提升将是最小的~1秒。
发布于 2022-09-27 19:53:24
这里没有足够的信息来诊断这个问题,因此我们无法评论分页是否是一个合适的解决方案。
为了更好地理解这个问题,最好首先为查询收集.explain("executionStats")。您通常可以这样做,方法是接受关注点的查询,并将解释方法附加到shell的末尾,请参阅这里的文件。可能是缺少索引( { id: 1, created_at: -1 }上的索引可能会在这里有所帮助)。但是可能还有其他一些因素,如资源瓶颈、网络延迟等等。explain的输出将帮助我们缩小问题范围,从而更好地理解可能需要什么样的解决方案。
顺便说一句,这里是否有意使用id?注意,MongoDB中的所有文档都有一个(强制的) _id字段。
在问题的其余部分,似乎还存在着其他一些潜在的误解。为了快速接触其中的一些:
因为MongoDB仍然需要查看所有的记录。MongoDB是否进行了性能优化?
数据库并不总是必须经过完整的匹配结果集才能返回其中的一个子集。只有当它不得不对结果进行排序,并且没有匹配的索引来帮助它这样做的时候,情况才是这样。上面提到的索引将支持允许它有效地访问和检索所请求的结果子集的排序。
有一些关于主题在这里他们的文件的参考资料。
我认为在聚合过程中执行联接并不重要
你指的是什么加入?
在MongoDB中,联接通过$lookup聚合阶段进行处理。问题中的示例查询似乎不是聚合,也不包括$lookup。关于$lookup的性能和问题可能是另一个问题。
总的来说,这个查询可以从当前15秒的运行时得到改进,这是可能的。确认这一点,并弄清楚如何做到这一点,需要一些额外的信息。
https://dba.stackexchange.com/questions/315806
复制相似问题