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

面试官:小伙子,你的代码为什么这么丝滑?

现代 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


猜你喜欢

  • 使用 Headless CMS 简化博客网站搭建

    在传统的博客网站搭建模式中,通常需要使用一个完整的 CMS 系统,如 WordPress 或 Joomla 等,它们提供了完整的前端和后端功能,包括用户管理、文章发布、样式自定义等。

    5 小时前
  • Cypress 错误解决:如何解决 No Such Element 错误

    Cypress 是一个基于 JavaScript 的前端自动化测试框架,它可以帮助我们高效地编写和运行自动化测试用例。然而,在使用 Cypress 进行测试的过程中,我们有时会遇到 No Such E...

    5 小时前
  • Mocha 测试中怎么样才能只执行部分测试用例?

    在使用 Mocha 进行测试时,你可能需要只运行部分测试用例而不是全部运行。这可能是因为你的测试套件非常大,或者你想只测试一部分代码。本文将介绍如何在 Mocha 中只执行部分测试用例,并提供一些示例...

    5 小时前
  • IOS 开发:如何优化本地存储

    本地存储是一种在移动应用程序和网站开发中常见的技术,它可以在用户离线时继续提供信息、内容和功能。在 IOS 开发中,使用本地存储的最佳方法是使用内置数据库 SQLite。

    5 小时前
  • TypeScript 中使用 let 和 const 定义变量和常量

    介绍 TypeScript 是一种静态类型检查器,它扩展了 JavaScript 并使其更易于使用和维护。在 TypeScript 中,我们可以使用 let 和 const 来定义变量和常量。

    5 小时前
  • 如何修复 CSS Reset 对滚动条样式的影响?

    在前端开发中,CSS Reset 是一个非常常见的技术。 它的原理是通过将浏览器的默认样式重置为一致的标准,以确保不同浏览器之间的样式相同。 但是 CSS Reset 常常会对浏览器滚动条样式造成影响...

    5 小时前
  • 在 Fastify 中构建 JWT 认证服务器

    引言 JWT(JSON Web Tokens)是一种用于安全交换信息的开放式标准,它可以在多个服务之间传递认证信息。在构建 Web 应用程序时,往往需要在请求和响应之间进行身份验证,JWT 作为一种有...

    5 小时前
  • 如何使用 ES6 中的数组方法简化代码

    如何使用 ES6 中的数组方法简化代码 随着 JavaScript 语言的发展,ES6 中新增的许多数组方法大大简化了开发人员的编程工作。这些方法可以让我们更容易地处理数据和操作数组,同时大大增加了代...

    5 小时前
  • SPA 开发中前后端分离的优缺点及应用实践

    单页应用(Single Page Application,SPA)是一种现代化的 Web 应用程序开发模式,它的一个特点就是前后端分离。本文将介绍 SPA 开发中前后端分离的优缺点,以及如何实践前后端...

    5 小时前
  • 使用 Enzyme + Jest 测试通过 HOC 形式创建的 React 组件

    在 React 中,高阶组件(Higher Order Component,简称 HOC)是一种非常常见的模式,它允许我们将组件逻辑重用在多个组件之间。使用 HOC 可以让我们更好地管理组件间的复杂度...

    5 小时前
  • PM2 与 Docker:构建可伸缩的 Node.js 应用程序

    前言 在开发现代 Web 应用程序时,Node.js 已成为最受欢迎的开发语言之一。Node.js 可以大力发挥其高度可扩展的架构,以构建高性能的 Web 应用程序。

    5 小时前
  • Material Design 中主题颜色的修改与自定义方法

    Material Design 是 Google 在 2014 年发布的一种全新的平面设计语言,旨在提供一个简洁、明晰、具有层次的用户界面设计风格。该设计语言使用明亮的色彩、深入的阴影效果、多种类型的...

    5 小时前
  • CSS Grid 布局问题集锦

    CSS Grid 布局是一种基于网格的布局系统,可以帮助前端开发人员更轻松地构建自适应、灵活且可复用的界面。尽管 CSS Grid 布局越来越普及,但是仍然存在一些问题需要面对和解决。

    5 小时前
  • 在 TailwindCSS 中实现无限滚动加载的技巧

    随着 Web 应用程序的普及,无限滚动加载成为了越来越流行的设计模式。它可以使用户感到更流畅,避免需要单击“下一页”按钮的情况。在 TailwindCSS 中实现无限滚动加载并不难,但是需要了解一些特...

    5 小时前
  • Redux 和 Immutable 数据结构的集成

    Redux 和 Immutable 数据结构的集成 储存和操作状态是前端应用程序的重要组成部分。Redux 和 Immutable 都是流行的前端技术,它们可以帮助处理状态,并提高应用程序的性能。

    5 小时前
  • ECMAScript 2021 和 React:优化性能的新方法

    前言 前端开发涉及到很多复杂的技术,而随着业界不断提升对用户体验的要求,性能优化也成为了前端开发的重点。ECMAScript 2021 和 React 的新功能在性能优化方面提供了一些新的方法,让开发...

    5 小时前
  • 10个ECMAScript 2019的新特性

    ECMAScript是JavaScript的标准规范,每年都会推出新的版本,提供新的特性和语法糖。2019版的ECMAScript已经发布,本篇文章将详细介绍10个新特性,对前端开发有指导意义。

    5 小时前
  • 如何实现无障碍访问依赖动态内容的应用程序?

    随着互联网技术的发展,越来越多的应用程序需要依赖动态内容来提供用户体验,例如 AJAX 加载、单页应用程序等。然而,这些应用程序往往会给残障人士造成访问困难,导致其无法充分利用这些服务。

    5 小时前
  • 构建高可用的 SPA 应用:浏览器兼容解决方案

    单页应用(Single Page Application,SPA)是现代 Web 开发技术的重要组成部分,它可以提供卓越的用户体验和高效的页面加载速度。但是,由于 Web 浏览器市场的多样性,有时候我...

    5 小时前
  • 在 SASS 中使用媒体查询的正确方法

    在SASS中使用媒体查询的正确方法 作为前端开发人员,我们经常需要针对不同的屏幕尺寸和设备类型来优化我们的网页布局和样式。这时候,媒体查询就成了我们必不可少的工具。

    5 小时前

相关推荐