【问题标题】:Why we use findAndCountAll in Sequelize(MySQL)?为什么我们在 Sequelize(MySQL) 中使用 findAndCountAll?
【发布时间】:2022-01-25 09:54:38
【问题描述】:

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

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

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'}]

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

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

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

-- findAll
SELECT id, name FROM Test;

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

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

有没有一种情况是findAndCountAll 的性能优于findAlllength?还是我们使用 findAndCountAll 方法的原因?

【问题讨论】:

    标签: mysql database orm sequelize.js backend


    【解决方案1】:

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

    因此,例如,在第二个选择查询中,您可能会得到记录总数等于 100 并且只有 10 个第一条记录。 这样,您将知道您有多少条记录以及多少页,以便能够指示正确的 LIMITOFFSET 选项以获得所需的记录页。

    当然,如果你不打算使用这样的分页并且不指明offsetlimit 选项,那么你就不需要使用findAndCountAll。使用findAll 并检查length 道具就足够了。

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 2011-02-05
      • 2023-01-26
      • 2014-06-20
      • 2017-05-03
      • 2013-10-20
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多