当 Relay 游标分页总是获取整个数据集时,它如何处理大数据集?

     2023-03-08     38

关键词:

【中文标题】当 Relay 游标分页总是获取整个数据集时,它如何处理大数据集?【英文标题】:How does Relay cursor pagination handle big datasets when it always fetches the whole dataset? 【发布时间】:2020-01-27 19:41:16 【问题描述】:

我目前正在开发一个使用 Apollo Server/PostgresQL 和 Knex/Objection 的 GraphQL 项目。

我正在使用的数据集可以很容易地增加到 10 万个项目。

所以分页的问题出现了,我试图找到一种方法来使用基于光标的分页,因为这似乎是这些天的标准。

但是在检查了几个实现之后,例如:

https://facebook.github.io/relay/graphql/connections.htm#sec-Pagination-algorithm https://github.com/Terminal-Systems/apollo-cursor-pagination

我觉得对于所有这些实现,在基于光标进行切片之前,会获取整个数据集。这让我感到困惑,因为当您使用更大的数据集时,这似乎是一个巨大的性能问题?

即使在我链接的 Relay 规范中,它也声明您在根据 before 或 after 参数进行切片之前以 allEdges 开头。

有什么我遗漏的吗?因为我看不出这会是比基于偏移的分页更好的方法,但我希望被证明是错误的,并表明我的推理不正确。

干杯,周五快乐!

【问题讨论】:

【参考方案1】:

中继规范确实指定获取满足提供的beforeafter 参数的所有边,然后根据firstlast 参数对数据进行切片。在处理较大的表时,这样做确实会明显变慢并且占用更多内存。

使用基于游标的分页优于基于偏移的主要好处是它更适用于经常添加或删除行的表。分页时可能会添加或删除边缘 - 这可能导致在使用基于偏移的分页时跳过边缘或获得重复的边缘。

基于光标的分页可以以不需要获取所有行的方式实现。有像 this one 这样的库可以做到这一点。我不能说这样做是否会在技术上使您的服务器不“符合规范”,但我想只要结果相同,您的服务器仍然会与 Relay 客户端兼容。也就是说,如果您不担心在前端支持 Relay 客户端,则没有必要实现 Relay 样式的连接或 Relay 规范的任何其他部分。您可以在符合 Relay 的服务器之外进行基于光标的分页。

【讨论】:

如何从数据库中获取 Graphql 中的分页游标?

】如何从数据库中获取Graphql中的分页游标?【英文标题】:HowtogetacursorforpaginationinGraphqlfromadatabase?【发布时间】:2019-11-2104:39:24【问题描述】:我在获取真正的游标以解决GraphQL中的数据库分页结果时遇到了可怕的问题。不管我... 查看详情

从 Netezza 数据库创建 SAS 数据集时,SAS“CLI 游标扩展提取错误:数值超出范围”

】从Netezza数据库创建SAS数据集时,SAS“CLI游标扩展提取错误:数值超出范围”【英文标题】:SAS"CLIcursorextendedfetcherror:Numericvalueoutofrange"whilecreatingSASdatasetfromNetezzaDatabase【发布时间】:2019-11-2012:47:03【问题描述】:我正在... 查看详情

elasticsearch获取大批量数据时深度分页(from&size)vsscroll游标查询(代码片段)

...对es服务造成一定隐患,因此需要改为官方推荐的scroll(游标)方式查询获取全量数据。    对于深度分页获取大量数据的劣势官方文档已给出了较为详细的解释,并且官方建议使用scroll的方式来进行全量数据的获... 查看详情

solr研磨之游标分页(代码片段)

作者:战斗民族就是干转载请注明地址:http://www.cnblogs.com/prayers/p/8986498.html  普通分页  当需要深度分页的时候,比如查询第10000页数据,每页显示10条,意味着需要提取前10000x10页的数据,并将这100000条数据缓存在内存中,... 查看详情

从 Relay 中的动态组件获取片段

】从Relay中的动态组件获取片段【英文标题】:getFragmentfromadynamiccomponentinRelay【发布时间】:2016-05-0604:40:01【问题描述】:我的用例是我有一个使用来自CMS的数据的Node应用程序,并且在该CMS中,我让用户能够选择一个React组件作... 查看详情

mysql存储过程,获取使用游标查询的结果集

参考技术AMySQL存储过程中,使用游标查询,返回的是结果集时,如何查看调用存储过程输出结果呢?解决方案:存储过程不返回数据,但它能创建和填充另一个表。所以在存储过程运行中创建临时表。该临时表将保存存储过程中... 查看详情

您如何为 ORM 的分页定义中继连接?

】您如何为ORM的分页定义中继连接?【英文标题】:HowdoyoudefinearelayconnectionforpaginationagainstanORM?【发布时间】:2015-12-1119:48:35【问题描述】:我查看了Relay的所有文档,但似乎没有关于如何使用ORM建立Relay连接的简单说明。所有示... 查看详情

什么是游标?

游标:是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数... 查看详情

参考光标和结果集

...我正在从我的java类中调用一个存储过程,它返回一个ref游标,我正在从游标中提取结果集并迭代结果集以供我使用,现在我的问题是这个返回的ref游标是包含所有数据还是在游标上调用getObject以获取结果集时再次进入数据库服... 查看详情

将 Relay 中的数据与 React Native 中的 react-navigation 一起使用时,未获取 Relay 中的数据

...Relay中的数据与ReactNative中的react-navigation一起使用时,未获取Relay中的数据【英文标题】:DatainRelaynotfetchedwhenusingitwithreact-navigationinReactNative【发布时间】:2017-08-2216:22:46【问题描述】:我正在尝试使用Relay和react-navigation设置我的... 查看详情

当 sink 是二进制数据集时,源必须是二进制

】当sink是二进制数据集时,源必须是二进制【英文标题】:Sourcemustbebinarywhensinkisbinarydataset【发布时间】:2021-09-1802:35:30【问题描述】:我正在尝试从网页下载一个csv文件(api返回一个csv文件,而不是json),并将其存储在数据... 查看详情

我可以使用 GraphQL/Relay 查询来修改数据而无需获取

】我可以使用GraphQL/Relay查询来修改数据而无需获取【英文标题】:CanIuseaGraphQL/Relayqueryformodifyingdatawithoutfetch【发布时间】:2016-12-0508:57:01【问题描述】:中继突变被定义为“由写入数据存储然后获取任何更改的字段组成的操作... 查看详情

在 vue/nuxt 中获取和渲染大型数据集时性能下降

】在vue/nuxt中获取和渲染大型数据集时性能下降【英文标题】:Slowperformancewhenfetchingandrenderinglargedatasetinvue/nuxt【发布时间】:2021-12-0305:06:20【问题描述】:好的,我的情况如下...我必须根据axios获取的项目在vue中渲染一个列表。... 查看详情

当页码更改时,React 分页不会更新页面数据

】当页码更改时,React分页不会更新页面数据【英文标题】:Reactpaginationdoesnotupdatepagedatawhenpagenumberischanged【发布时间】:2020-02-2503:35:54【问题描述】:我是新手,我正在使用“ReactTable”组件来显示数据以及分页。更改页面时,... 查看详情

CKQueryOperation queryCompletionBlock 返回一个 nil 游标

】CKQueryOperationqueryCompletionBlock返回一个nil游标【英文标题】:CKQueryOperationqueryCompletionBlockreturnanilcursor【发布时间】:2020-04-1914:51:38【问题描述】:我正在使用CKQueryOperation获取CloudKit数据库。出于某种原因,每次按下获取按钮时... 查看详情

Python 中的 SVM 拟合数据集时出错

...ngdataset【发布时间】:2016-05-1708:20:36【问题描述】:我对整个SVM和数据集还很陌生。我做了很多研究,但我无法弄清楚问题是什么。importmatplotlib.pyplotaspltfromsklearnimportdatasetsfromsklearnimportsvmboston=datasets.loa 查看详情

elasticsearch中的scroll机制

...lId机制则能够帮助我们优化查询性能。该机制类似于一个游标,可以通过ScrollAPI来获取每个批次的结果。每个结果都包含一个新的ScrollId,该ID可以用于检索下一个批次的结果,这样我们就可以按需逐批获取数据。使用ScrollId机制... 查看详情

具有多列的基于 MySQL 游标的分页

】具有多列的基于MySQL游标的分页【英文标题】:MySQLcursorbasedpaginationwithmultiplecolumns【发布时间】:2016-10-2706:56:23【问题描述】:我有一些表,我想使用基于游标的分页来查询,但它需要申请多个列。让我们举一个使用2列的简化... 查看详情