这是 GraphQL 的一个缺点:解决 GraphQL 中的 N + 1 查询问题

GraphQL 是如今前端领域中非常热门的技术,这是一种新兴的 API 语言,它具有较为强大的查询能力,一个 GraphQL 查询可以获取多个资源,这就是 GraphQL 所具有的天然优势。但是也正因此,它也存在一个问题:N+1 查询问题。

什么是 N+1 查询问题?

当我们使用 GraphQL 查询一个数据集合的时候,我们可能会遇到需要与每条 data 关联的其他数据,例如:

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

以上例子使用 GraphQL 查询所有用户,并查询他们的所有文章,还有每篇文章的评论。这种查询方式将查询数据分散成了多次查询,会导致 N+1 查询问题。

我们可以发现,在上面的查询中,首先会进行一次查询获取所有的用户,再进行 N 次查询获取每个用户的 posts 以及每篇文章的 comments。因此会进行 n+1 次查询,其中 n 表示 user 的数量。这种查询方式会造成后端系统压力上升,可能导致巨大的性能问题。

为了解决 GraphQL 中的 N+1 查询问题,我们可以使用 DataLoader 这个工具来进行优化。

DataLoader 是一个用于批量查询数据的 JavaScript 组件。它可以使用 batching 和 caching 来优化数据查询,从而避免 N+1 查询问题。

安装和配置 DataLoader

在使用 DataLoader 之前,需要先安装它。我们可以使用 npm 来安装 DataLoader:

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

接着,我们需要在 GraphQL 中进行 DataLoader 的配置。处理 GraphQL 请求的每个请求都应该有自己的 DataLoader 实例,这个实例应该是通过请求的上下文创建的。实例如下:

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

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

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

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

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

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

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

在上述代码中,我们首先要创建一个 DataLoader 实例 dataLoader,然后定义一个上下文对象 context,并赋值 dataLoader

使用 DataLoader 解决 N+1 查询问题

现在我们可以使用 DataLoader 来处理 GraphQL 中的 N+1 查询问题了。我们可以将每个具有相同 resolver 的 GraphQL 查询,以一个 batch 的形式,统一查询到同一个 DataLoader 里。这样就可以批量查询数据,而不是进行 N+1 查询,在数据量较大时能极大地提升性能。以下是实例代码:

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

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

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

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

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

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

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

在上述代码中,首先我们需要定义一个 resolvePosts 函数来查询所有的 post,并根据 userId 来将其分组。再定义一个函数 resolveComments 来查询所有的 comments,并根据 postId 来分组。这两个函数都会接受一个 dataLoader 的参数,给定将多个查询合并为一个查询的能力,从而帮助我们进行批处理操作。

总结

以上就是如何使用 DataLoader 工具解决 GraphQL 查询中的 N+1 查询问题的指导。掌握 N+1 查询问题的解决方法非常重要,因为它可以极大地提升 GraphQL 的性能,减轻后端服务器的压力。如果您正在使用 GraphQL,那么 DataLoader 工具会是您不可或缺的好伙伴。

参考资料:https://graphql.cn/code/#/code/batching-2

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6591c88feb4cecbf2d6cb95f


猜你喜欢

  • 使用 Koa 构建 Web 服务器

    在业务繁忙的现代互联网应用程序中,快速且可扩展的 Web 服务器设计是至关重要的。Koa 是一款基于 Node.js 的 Web 开发框架,它的设计简洁,但功能强大。

    10 个月前
  • 利用 Fastify 框架打造 RESTful API 的性能测试指南

    Fastify 是 Node.js 上的一个高性能 Web 框架,它支持传输层安全性(TLS,即 HTTPS)和对头大小、并发请求和响应速度等方面的优化。在构建高性能的 RESTful API 时,F...

    10 个月前
  • Hapi 框架如何处理 404 错误?

    在前端开发中,404 错误是经常出现的错误之一。在一些情况下,我们需要自己处理 404 错误,而 Hapi 框架是一个可以帮助我们处理 404 错误的工具。 什么是 Hapi 框架? Hapi 是一个...

    10 个月前
  • Custom Elements 与组件化开发的实践

    前言 在网页开发中,常常需要将界面元素拆分为多个独立、可复用的组件,从而提高代码的可维护性和可扩展性。随着 Web 技术的不断发展和完善,实现组件化开发的方式也在不断升级。

    10 个月前
  • 用 PostgreSQL 和 Hasura 构建现代应用:基于 GraphQL

    在现代应用开发中,API 是一个不可或缺的部分。传统的 RESTful API 尽管已经成为了业界 common sense,但其需要开发者自己维护路由、逻辑复杂度高等问题挑战。

    10 个月前
  • 如何利用 RxJS 创建一个自动完成功能

    在现代的 Web 开发中,自动完成功能已经变得非常常见。这个功能允许用户在输入框中键入一部分文本时自动列出匹配的选项。利用 Reactive Programming 的技术可以简易地实现这个功能,Rx...

    10 个月前
  • CSS Reset 和 CSS 框架的关系及异同点

    在前端开发中,CSS Reset 和 CSS 框架都属于常用的工具。CSS Reset 的作用是重置浏览器的默认样式,统一不同浏览器的样式差异。而 CSS 框架则是封装了常用样式和组件功能的 CSS ...

    10 个月前
  • 在 Deno 中实现简单的静态文件服务器

    最近,随着对 Deno 的兴趣不断提升,越来越多的开发者开始研究如何在 Deno 中实现简单的静态文件服务器。本篇文章将介绍如何利用 Deno 的 HTTP 模块和文件系统模块,编写一个简单的静态文件...

    10 个月前
  • React Diff 算法的本质解决高效问题

    在React中,我们经常使用组件进行UI的构建和渲染。但是,如果组件中的某些部分需要更新,React的Diff算法会起到关键作用。 本文将深入探讨React Diff算法的本质,以及如何在React代...

    10 个月前
  • OpenCV 基于 Socket.io 实现图像传输及分布式处理

    引言 在前端领域中,常常需要进行大规模的图像处理和分析,而这种任务往往需要占用大量的计算资源,无法单靠一台电脑完成。本文将介绍使用 OpenCV 和 Socket.io 实现图像传输和分布式处理的方法...

    10 个月前
  • Babel 插件 preset-env 概述

    前言 随着前端技术的不断发展,JavaScript 语言也在不断进化,新的 ECMAScript 规范引入的各种新特性,不仅让写代码更加方便,也让代码执行的效率更高。

    10 个月前
  • Mocha 测试框架中如何使用 istanbul 进行测试覆盖率分析

    在前端开发中,测试是确保代码质量和稳定性的重要手段之一。而测试覆盖率分析则是评估测试质量的重要指标之一。在 Mocha 测试框架中,我们可以使用 Istanbul 工具进行测试覆盖率分析,本文将介绍如...

    10 个月前
  • Material Design 中的动态背景色实现教程

    Material Design 中的动态背景色实现教程 在 Google 推出的 Material Design 设计语言中,动画和交互是非常重要的部分。其中之一的特点就是使用动态背景色来让用户感到更...

    10 个月前
  • ECMAScript 2017:使用 Proxy.revocable 创建可取消的代理

    简介 ECMAScript 2017 是 JavaScript 的下一个版本,其中引入了 Proxy.revocable 方法,它可以在创建 Proxy 代理对象时同时创建一个撤销代理的 token,...

    10 个月前
  • ECMAScript 2019 中的 Object.fromEntries 方法的详细介绍

    ECMAScript 2019 在语言规范上增加了一些新特性,其中 Object.fromEntries 就是其中一个有用的新方法。这个方法主要是用来从键值对数组中创建一个新的对象。

    10 个月前
  • AngularJS 的 UI-Router 指令详解及使用示例

    介绍 AngularJS 是一款非常优秀的前端框架,而 UI-Router 是 AngularJS 框架中非常重要的一部分。UI-Router 是 AngularJS 框架中用于管理多个视图的路由框架...

    10 个月前
  • Redux 简单实现

    近年来,前端技术飞速发展,前端框架层出不穷,Redux 作为其中的一员,已经成为了前端界广受欢迎的状态管理工具,但是 Redux 的核心原理仍然不为大多数开发者所理解。

    10 个月前
  • 解决 Webpack 打包 HTML 模板中图片路径不正确的问题

    问题背景 在前端开发中,我们常常需要使用 HTML 模板来渲染数据。而在使用 Webpack 打包的过程中,我们很容易遇到一个问题:HTML 模板中的图片路径不正确。

    10 个月前
  • 响应式设计中如何解决特定分辨率下元素出现错位的问题

    随着移动设备的普及以及互联网技术的发展,响应式设计成为了现今网站设计的主流趋势。通过响应式设计,网站可以在不同的设备上自适应,达到更好的用户体验。 然而,在实际的设计中,我们常常会遇到某些特定分辨率下...

    10 个月前
  • 使用 ESLint 优化你的 VueJS 项目

    在前端开发中,代码质量对于项目的维护和扩展至关重要。而 ESLint 是一个非常强大的工具,可以帮助我们在项目中实现一致的代码风格和错误检测。在本文中,我们将重点讲述如何使用 ESLint 来优化你的...

    10 个月前

相关推荐

    暂无文章