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

我有一个Node.js REST API,通过node-mysql直接使用MySQL数据库。

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

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

我打算在此端点上使用filter。 例如/api/v2/matches?filter[team]=TeamId

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

我是不是该:

  • 查询数据库的一切,并使用Array.prototype.filter()或类似的结果数组来正确地过滤数据。

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

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

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

SELECT *查询当然是为速度而devise的,但是您的DBMS将不得不覆盖整个数据集。 使用SELECT WHERE可以获得更好的执行时间,特别是如果您在数据库模式中提供了适当的索引,那么即使使用JOIN,也仅限于50个结果。

另外,请记住SELECT WHERE查询经过多年的研究,并加速了它们的技巧,而Array.prototype.filter可能是一个非常简单的实现:“if(lambda(x))arr.append(x )“ 或类似的东西。 几乎所有的公司都使用它而不是filter