为什么我们在 Sequelize(MySQL) 中使用 findAndCountAll?
Why we use findAndCountAll in Sequelize(MySQL)?
不知道为什么要用Sequelize(MySQL) findAndCountAll
方法。因为它发送了两个查询,我认为这很浪费。
假设我们有一个 Test
table 如下所示。
id
name
1
a
2
b
然后调用 findAndCountAll
和 findAll
方法,如下所示。
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
方法很浪费。
是否存在 findAndCountAll
比 findAll
和 length
表现更好的情况?或者我们使用 findAndCountAll 方法有什么原因吗?
findANdCountAll
的全部目的是与 limit
和 offset
选项一起使用来组织 server-side 分页。
在您指定两个选项后(我强烈建议添加带有一个字段或多个字段的 order
选项,这样您将获得每页记录的可预测结果)您将看到两个 SQL 查询之间的主要区别执行。
count
查询将没有 LIMIT
和 OFFSET
选项,以在查询中考虑所有条件和排序找出记录总数。同时,select
查询将使用 LIMIT
和 OFFSET
选项来获取指示的“页面”记录。
-- 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 条记录。
这样你就会知道你有多少条记录和多少页以及能够指示正确的 LIMIT
和 OFFSET
选项以获得所需的记录页。
当然,如果您不打算使用这样的分页并且不指定offset
和limit
选项,那么您就不需要使用findAndCountAll
。使用 findAll
并检查 length
prop.
就足够了
不知道为什么要用Sequelize(MySQL) findAndCountAll
方法。因为它发送了两个查询,我认为这很浪费。
假设我们有一个 Test
table 如下所示。
id | name |
---|---|
1 | a |
2 | b |
然后调用 findAndCountAll
和 findAll
方法,如下所示。
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
方法很浪费。
是否存在 findAndCountAll
比 findAll
和 length
表现更好的情况?或者我们使用 findAndCountAll 方法有什么原因吗?
findANdCountAll
的全部目的是与 limit
和 offset
选项一起使用来组织 server-side 分页。
在您指定两个选项后(我强烈建议添加带有一个字段或多个字段的 order
选项,这样您将获得每页记录的可预测结果)您将看到两个 SQL 查询之间的主要区别执行。
count
查询将没有 LIMIT
和 OFFSET
选项,以在查询中考虑所有条件和排序找出记录总数。同时,select
查询将使用 LIMIT
和 OFFSET
选项来获取指示的“页面”记录。
-- 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 条记录。
这样你就会知道你有多少条记录和多少页以及能够指示正确的 LIMIT
和 OFFSET
选项以获得所需的记录页。
当然,如果您不打算使用这样的分页并且不指定offset
和limit
选项,那么您就不需要使用findAndCountAll
。使用 findAll
并检查 length
prop.