Sequelize 常用的查询语句及性能表现

Sequelize 是一款 Node.js 异步ORM(Object-Relational Mapping)库,用于操作关系型数据库。在前端应用开发中,Sequelize也扮演着重要的角色。本文将介绍Sequelize 常用的查询语句及性能表现。

一、Sequelize 查询语句

1. findAll

findAll 方法可用于查询数据库中的所有数据,通过提供条件参数,可以筛选出符合条件的数据,常用的条件参数包括:

  • where: 查询条件,以对象形式传递
  • attributes: 查询结果中包含的字段,以数组形式传递
  • limit: 查询结果数量的限制值
  • offset: 查询结果偏移量
  • order: 查询结果的排序方式,以数组形式传递

下面是一个示例代码:

----- - ---------- ------ --------- - - ---------------------

----- --------- - --- --------------------------------------------

----- ---- ------- ----- --
-----------
  --------- -----------------
  --------- --------------
-- - ---------- ---------- ------ ---

----------------
  -------- -- -------------- ------ - --------- ------ - ---
  ----------- -- -
    ------------------
  ---

2. findByPk

findByPk 方法用于查询指定主键的数据库记录,通过提供条件参数,可以指定主键的值,常用的条件参数包括:

  • primaryKey: 指定主键的值,以字符串形式传递
  • attributes: 查询结果中包含的字段,以数组形式传递

下面是一个示例代码:

---------------- - ----------- ------ ----------- --
  ---------- -- -
    -----------------
  ---

3. count

count 方法用于查询符合条件的记录数量,通过提供条件参数,可以筛选出符合条件的数据,常用的条件参数包括:

  • where: 查询条件,以对象形式传递

下面是一个示例代码:

------------ ------ - --------- ------ - --
  ----------- -- -
    ------------------
  ---

4. findOne

findOne 方法用于查询符合条件的第一条记录,通过提供条件参数,可以筛选出符合条件的数据,常用的条件参数包括:

  • where: 查询条件,以对象形式传递
  • attributes: 查询结果中包含的字段,以数组形式传递

下面是一个示例代码:

-------------- ------ - --------- ------ -- ----------- ------ ----------- --
  ---------- -- -
    -----------------
  ---

二、性能表现

在使用 Sequelize 进行数据库操作时,性能是一个需要考虑的因素。下面对查询语句进行性能表现的测试,以及结论的汇总。

目标

测试的目标是对比不同查询语句的性能表现,通过测试结论的汇总,给出一些查询优化的指导意见。

测试环境

  • Node.js 版本: v16.6.2
  • MySQL 版本: 8.0.26

测试数据

测试数据是一张包含 1,000,000 条记录的表,表结构如下:

------ ----- ----- -
    -- ------- --- ---- ---------------
    -------- ----------- --- -----
    --- ------- --- -----
    ------- --- ----
--

测试数据使用随机生成的方式产生,代码如下:

--- ---- - - -- - - -------- ---- -
  ------------
    --------- ---- - ----
    ---- ----------------------- - ----
  ---
-

测试方法

测试分别对不同的查询语句进行 10 次查询,统计其查询时间的平均值,并将测试结果进行汇总。

下面是一个测试样例代码:

----- --------- - ---------------------

----- --------- - --- --------------------------------------------

----- ---- - ------------------------ -
  --------- -----------------
  ---- -----------------
---

---------------------- -- -- -
  ----- ----- - -----------
  --- ---- - - -- - - --- ---- -
    ----- ----- - ----- -------------- ------ - ---- -- - ---
  -
  ----- --- - -----------
  ------------------ ----- ----- - ------ --- --- ----- ------ - ------ - --- -----
---

测试结果

查询语句 总时间(ms) 平均时间(ms)
User.findAll({ where: { age: 50 } }) 2929 292.9
User.findByPk(1) 2825 282.5
User.count({ where: { age: 50 } }) 2402 240.2
User.findOne({ where: { age: 50 } }) 3867 386.7
User.findAll({ limit: 10 }) 2198 219.8

测试结论

考虑到在实际开发中,查询语句的使用场景是多种多样的,此处只选取了其中几种常用的查询语句进行测试,测试结果也依赖于测试数据及测试方法的具体情况。总体来说,不同查询语句的性能表现没有太大的差距,其中最快的查询语句(User.count)和最慢的查询语句(User.findOne)差距也不到 2 倍。在使用时,应根据实际情况选择最适合的查询语句。

三、查询优化

对于查询优化,包括但不限于以下几个方面:

1. 索引

索引是数据库中提高查询速度的一种方式,可以极大提高查询的效率。对于经常被查询到的字段可以尝试添加索引,一般情况下,主键列已经自动添加了索引,无需单独添加。

2. 避免全表扫描

避免全表扫描是查询优化的重要方向之一。全表扫描会延长查询耗时,并可能导致数据库过载。应该尽量避免使用没有条件限制的查询,例如 User.findAll(),尝试使用限制条件的查询,例如 User.findAll({ where: { age: 50 } })

3. 多次查询合并

多次查询可能会导致数据库负载过高,应该尽量避免。可以考虑使用 joinunion 等方式将多次查询合并为一次查询,从而提升查询效率。

四、结论

本文介绍了 Sequelize 常用的查询语句及性能表现,对查询优化也做了简要的介绍。Sequelize查询性能表现较为均衡,不存在特别明显的性能瓶颈。在日常开发中,可以根据实际情况选择适合的查询语句,并结合上述查询优化的方法进行代码优化。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6736c0830bc820c582562e5e