我应该在PostgreSQL还是服务器后端过滤数据?



我正在做一个使用 graphql 和 PostgreSQL 的项目,我们想从数据库中选择某个日期之后的值的数据。它当前正在从数据库中选择所有数据,然后在服务器上对其进行过滤:

.filter(({time}) => moment(time).isAfter(startTime))

但是,我认为最好在数据库查询中进行此过滤,因为从未使用过完整的数据集。

在服务器上而不是在数据库查询中执行此操作有什么好处吗?

除非一些不寻常的边缘情况 - 例如后端代码的其他部分确实出于某种原因确实需要所有数据 - 通过首先用于获取数据的SQL过滤Postgres端的所有内容肯定会更有效。

这是正确的,原因如下:

  1. 假设表已正确编制索引,则筛选将能够在数据库中更快地进行。
  2. 不需要的数据不需要序列化并通过线路发送到后端,然后由后端自己的过滤丢弃。
  3. Postgres 和服务器端的内存占用量都应减少,因为只需要处理部分结果。

我自己没有使用过 GraphQL,但通过对它的文档进行一些探索,似乎GraphQL经常在不同层(数据库之外)使用其他机制来尝试提高性能。

值得一看的是,您的 GraphQL 查询正在生成的实际 SQL 是什么(这可以通过GraphQL中的函数来实现;也可以通过在 Postgres 服务器上启用某些日志设置并将日志输出与查询相关联来完成)。如果你想保持纯粹的 GraphQL,这可能会带来进一步的优化可能性。

不过,跳转到原始查询似乎是一个很好的可能性。当然,这是像DjangoActiveRecord这样的ORM经常做的事情。

最新更新