为什么我们在 Sequelize(MySQL) 中使用 findAndCountAll?

Why we use findAndCountAll in Sequelize(MySQL)?

不知道为什么要用Sequelize(MySQL) findAndCountAll方法。因为它发送了两个查询,我认为这很浪费。

假设我们有一个 Test table 如下所示。

id name
1 a
2 b

然后调用 findAndCountAllfindAll 方法,如下所示。

const result1 = await Test.findAndCountAll() --> {count: 2, rows: [{id: 1, name: 'a'}, {id: 2, name: 'b'}]}
const result2 = await Test.findAll() --> [{id: 1, name: 'a'}, {id: 2, name: 'b'}]

我们可以通过调用 length (result2.length) 从 result2 得到 count

findAndCountAll方法发送两次查询,findAll方法发送一次查询。

-- findAndCountAll
SELECT count(*) FROM Test;
SELECT id, name FROM Test;

-- findAll
SELECT id, name FROM Test;

我认为如果 Test table 中有这么多行,这会对数据库造成很大的负载(是 findAll 的 2 倍)。

这就是为什么我认为 findAndCountAll 方法很浪费。

是否存在 findAndCountAllfindAlllength 表现更好的情况?或者我们使用 findAndCountAll 方法有什么原因吗?

findANdCountAll 的全部目的是与 limitoffset 选项一起使用来组织 server-side 分页。
在您指定两个选项后(我强烈建议添加带有一个字段或多个字段的 order 选项,这样您将获得每页记录的可预测结果)您将看到两个 SQL 查询之间的主要区别执行。 count 查询将没有 LIMITOFFSET 选项,以在查询中考虑所有条件和排序找出记录总数。同时,select 查询将使用 LIMITOFFSET 选项来获取指示的“页面”记录。

-- findAndCountAll
SELECT count(*)
FROM Test WHERE name like '%test%';

SELECT id, name
FROM Test
WHERE name like '%test%'
LIMIT 10
OFFSET 0
ORDER BY name, id;

因此,例如,在第二个 select 查询中,您可能会得到总记录数为 100 且前 10 条记录。 这样你就会知道你有多少条记录和多少页以及能够指示正确的 LIMITOFFSET 选项以获得所需的记录页。

当然,如果您不打算使用这样的分页并且不指定offsetlimit 选项,那么您就不需要使用findAndCountAll。使用 findAll 并检查 length prop.

就足够了