我正在做一个使用 graphql 和 PostgreSQL 的项目,我们想从数据库中选择某个日期之后的值的数据。它当前正在从数据库中选择所有数据,然后在服务器上对其进行过滤:
.filter(({time}) => moment(time).isAfter(startTime))
但是,我认为最好在数据库查询中进行此过滤,因为从未使用过完整的数据集。
在服务器上而不是在数据库查询中执行此操作有什么好处吗?
除非一些不寻常的边缘情况 - 例如后端代码的其他部分确实出于某种原因确实需要所有数据 - 通过首先用于获取数据的SQL过滤Postgres端的所有内容肯定会更有效。
这是正确的,原因如下:
- 假设表已正确编制索引,则筛选将能够在数据库中更快地进行。
- 不需要的数据不需要序列化并通过线路发送到后端,然后由后端自己的过滤丢弃。
- Postgres 和服务器端的内存占用量都应减少,因为只需要处理部分结果。
我自己没有使用过 GraphQL,但通过对它的文档进行一些探索,似乎GraphQL经常在不同层(数据库之外)使用其他机制来尝试提高性能。
值得一看的是,您的 GraphQL 查询正在生成的实际 SQL 是什么(这可以通过GraphQL中的函数来实现;也可以通过在 Postgres 服务器上启用某些日志设置并将日志输出与查询相关联来完成)。如果你想保持纯粹的 GraphQL,这可能会带来进一步的优化可能性。
不过,跳转到原始查询似乎是一个很好的可能性。当然,这是像Django和ActiveRecord这样的ORM经常做的事情。