Fastify 框架中 ORM 框架的性能优化方法

阅读时长 8 分钟读完

现代 Web 应用中,ORM 框架是很常见的一种框架,其可以将数据库表的结构映射到开发语言中的对象,提供了一种更加面向对象的常规数据访问方式,尤其在快速开发的中小型公司中使用广泛。Fastify 是一位 Node.js 社区非常受欢迎的 Web 框架,其性能极佳,但是在使用 ORM 框架时,也需要考虑性能优化的问题。

本文将探讨 Fastify 框架中如何使用 ORM 框架,以及对 ORM 框架进行性能优化的方法。

1. ORM 框架的基本概念

ORM,Object-Relational Mapping,对象-关系映射,它是一种将关系型数据库表示为对象的方式。开发人员不必与 SQL 查询或为对象/关系之间映射写代码来调用数据库了。ORM 客户端负责管理数据库连接并处理查询,以及将服务器端语言中的数据类型与数据库中的类型转换。ORM 将数据库存储视为常规对象,其中每个行映射到一个对象,每个列映射到对象的属性,即 ORM 将数据库的行和列映射到实际使用面向对象语言编写的实现上。

ORM 框架的优点:

  • 避免了将代码与底层存储细节耦合在一起
  • 模型实现相对容易,易于维护
  • 支持易于实现的代码重用、模块化和可移植性,尤其是开发大型企业级应用程序时
  • ORM 框架通常更易于学习和阅读,这也为新开发人员的培养提供了良好的平台

2. 在 Fastify 框架中使用 ORM 框架

ORM 框架是与关系型数据库绑定的,可以使用 MySQL、PostgreSQL、SQL Server 等数据库。常用的 ORM 框架有 Sequelize、TypeORM、Prisma。这里以使用 Sequelize 为例。

首先,需要在项目中安装 Sequelize。

然后,在 Fastify 项目中建立一个 Sequelize 实例,并指定连接 URL,示例如下:

连接池是一个维护数据库连接的池,它有助于减少连接和断开连接的开销,从而减少了整体延迟。将 Sequelize 与连接池一起使用,可以提高性能。

下面,展示在 Fastify 声明周期中使用 Sequelize 的示例代码:

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

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

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

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

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

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

这里使用 fastify.decorate 向 fastify 实例中添加 sequelize 属性,将之后我们在路由中使用的 ORM 实例维持在全局范围内。fastify.addHook 被 Fastify 框架用来管理服务器生命周期,这里将其用来在实例关闭时关闭 Sequelize 建立的数据库连接。

3. Sequelize ORM 的性能优化

Sequelize ORM 可以支持事务处理,多次查询数据,并可以与 MySQL、PostgreSQL、SQL Server 等数据库实现交互。如果使用不当,可能会导致性能下降,所以我们需要一个优化方法。

3.1 合并查询

当需要检索多个数据源并将数据合并为单个对象时,可以利用 Sequelize 内置支持的 accessor 功能和 eager loading,避免了多次查询数据库的开销:

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

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

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

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

这里,我们在 Type 模型上定义了 items 关联属性,定义这个 accessor 之后,我们就可以在 findAll 操作中使用 include 关键字,指定要在查询中包含的关联模型。

3.2 批量操作

良好的性能最大程度上依赖于在单个连接中进行批量操作,这减少了客户端和 DBMS 管理期间的通信开销。例如:

  • 批量插入记录
  • 批量更新记录
  • 批量删除记录
  • 考虑缓存 SQL 语句

3.3 限定返回数据的数量

为了性能优化,ORM 应用程序应总是限制返回的记录。通过 limit 和 offset 选项来指定返回的数据量范围。

3.4 使用索引

在访问大量数据时,使用索引有助于优化数据库性能。为匹配访问查询声明正确类型的索引有望为 SQL 查询提供良好的性能。

Sequelize 中使用索引:

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

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

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

这里,createIndex 函数可以在 User 模型中为表的列添加索引。然后使用 Sequelize 查询时,ORM 会优先从索引中获取数据,而不是对整个表进行扫描处理,提高了查询效率。

注意,单个的索引也会增加数据库写入开销,建议在必要时使用索引并进行正确的配置。

3.5 缓存结果

结果缓存可以提高临时结果的访问速度。缓存可以减少 CPU 和磁盘 I/O 的负荷,并提供更快的响应。Redis 是一个非常流行的缓存服务,现在以该服务为例进行缓存和 Sequelize 集成:

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

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

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

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

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

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

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

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

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

这里,Sequelize 连接到 DBMS 以查询数据。如果这是第一次查询,它将读取并将结果写入 Redis 服务中。在第二次查询时,它会快速地将结果从 Redis 中读取出来。

结论

在 Fastify 平台上使用 Sequelize ORM 可以有效地开发出出色的应用程序。在此基础上,本文介绍了检索数据、优化查询、使用索引和结果缓存等多种方法,以帮助用户获得出色的性能和好的体验。

是时候拥抱 Fastify 和 Sequelize ORM 框架,一同推动 Web 服务的开发效率和用户体验的提升。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66f3fa9bf40ec5a964e65f79

纠错
反馈