如何在REST API端点上处理结果过滤?

时间:2017-04-27 02:36:21

标签: mysql node.js api api-design

我有一个Node.js REST API,通过node-mysql直接与MySQL数据库一起工作。

我正在寻找一种以最佳的方式在端点上过滤数据库结果的方法。

目前,我有一个端点/api/v2/matches,其中我的API代码查询数据库并将结果作为JSON响应输出。

我计划在此端点上使用过滤器。例如/api/v2/matches?filter[team]=TeamId

在我的代码中过滤这些数据库结果的最佳方法/最佳性能方法是什么?

我应该:

  • 查询数据库中的所有内容,并在结果数组中使用Array.prototype.filter()或类似内容来正确过滤数据。

  • 以编程方式汇编我的查询字符串,具体取决于req.query.filters对象上传递的内容并查询数据库。

请记住,我对此端点的当前查询(返回所有结果的查询)有一些INNER JOINS正在进行。我也在此查询中使用LIMIT 50

1 个答案:

答案 0 :(得分:1)

磁盘访问时间和数据传输是这里的主要瓶颈。但是,LIMIT 50对此有一个有趣的含义。您应该在数据库查询中使用过滤器,因为它将限制数据库花费在搜索上的时间,并且如果您的数据库是远程的,它也将限制传输的数据量(如果您的数据库不是远程的,则收益会更小但是还在那儿)。与此相比,构建查询所产生的轻微开销可以忽略不计。

SELECT *查询肯定是为速度而设计的,但您的DBMS必须覆盖整个数据集。使用SELECT WHERE可以获得更好的执行时间,尤其是如果您在数据库模式中提供了适当的索引,因为您的结果限制为50,即使使用JOIN也是如此。

另外,请记住,SELECT WHERE查询经过多年的研究已有数年的时间和技巧可以加速它们,而Array.prototype.filter可能是一个非常简单的实现" if(lambda) (x))arr.append(x)"或类似的东西。这是一个很好的理由,几乎每个公司都使用它而不是filter