首页 > 解决方案 > 如何限制从数据库中获取的次数(编辑:使用分页)?

问题描述

所以我不知道我的标题是否有意义,但我希望我能在这里更好地解释一下:

我有这个代码:

let rsps = await Promise.all([
    fetch(`/api/trace?id=${task.ID}`),
    fetch(`/api/trace?parentid=${task.ID}`),
    fetch(`/api/trace?where=${task.Where}`),
    fetch(`/api/trace?kind=${task.Kind}`),
]);

现在,它正在按应有的方式工作,但是我遇到的问题是,在某些时候,它正在获取太多数据(例如,在某一时刻,它会从数据库中获取超过 4000 个对象,并且只占用处理能力太强)。

我的问题是:是否可以限制它应该获取多少数据点?就像也许做一个for循环来结束我想要多少个数据点?我希望能够说出它可以获取的可能的 4000 个数据点,只获取前 200 个左右。这可能吗?

谢谢

标签: javascriptfetch

解决方案


你应该使用分页。因此,可能的 fetch 调用可能是:

/api/trace?id=${task.ID}&page=1&per_page=20

这意味着您想要数据库中的前 20 个结果。

/api/trace?id=${task.ID}&page=2&per_page=20

这意味着您总是想要从数据库结果集的第 21 行开始的 20 个结果)。

所以page让你创建你的偏移量来查询你的数据库。

偏移量在您的后端定义为:

偏移量 = 页 * 每页 - 每页。

因此,根据您传递的获取参数,在我提供的第二个示例中,偏移量将是:

偏移量 = 2 * 20 - 20 = 20

在这种情况下,您的数据库查询应该是:

SELECT ....
.....
LIMIT 20 OFFSET 20;

(我想要数据库中第 21 行结果集中的 20 个结果)

当然,您的前端应该知道整个结果集的基数,而不受后端的任何限制,以便创建分页结构。因此,对于每次获取,您的后端应该从数据库中发送预期的行和查询的总记录,没有任何限制。


推荐阅读