如何处理 REST API 端点上的结果过滤?
How to handle result filtering on a REST API endpoint?
我有一个 Node.js REST API,通过 node-mysql
.
直接使用 MySQL 数据库
我正在寻找一种以最高效的方式过滤端点上的数据库结果的方法。
目前,我有一个端点 /api/v2/matches
,我的 API 代码在其中查询数据库并将结果输出为 JSON 响应。
我打算在此端点上使用过滤器。例如/api/v2/matches?filter[team]=TeamId
在我的代码中筛选这些数据库结果的最佳way/most性能方法是什么?
我应该:
查询数据库中的所有内容,并在我的结果数组上使用 Array.prototype.filter()
或类似的方法来正确过滤数据。
Assemble 我的查询字符串以编程方式,取决于传递给 req.query.filters
对象的内容并查询数据库。
请记住,我当前对此端点的查询(returns 所有结果的查询)有几个 INNER JOINS
正在进行。我也在这个查询中使用 LIMIT 50
。
磁盘访问时间和数据传输是这里的主要瓶颈。但是,LIMIT 50
对此有一个有趣的含义。您应该在数据库查询中使用过滤器,因为它会限制数据库花费在搜索上的时间,如果您的数据库是远程的,它还会限制传输的数据量(如果您的数据库不在远程,收益会更小但还在那里)。与此相比,构建查询所产生的轻微开销可以忽略不计。
SELECT *
查询当然是为速度而设计的,但是您的 DBMS 必须覆盖整个数据集。使用 SELECT WHERE
可以获得更好的执行时间,特别是如果您在数据库模式中提供适当的索引,因为即使使用 JOIN,您也只能获得 50 个结果。
此外,请记住,SELECT WHERE
查询背后有多年的研究和加速它们的技巧,而 Array.prototype.filter 可能是 "if (lambda(x)) arr.append(x)" 的一个非常简单的实现或类似的东西。几乎所有公司都使用它而不是 filter
.
是有充分理由的
我有一个 Node.js REST API,通过 node-mysql
.
我正在寻找一种以最高效的方式过滤端点上的数据库结果的方法。
目前,我有一个端点 /api/v2/matches
,我的 API 代码在其中查询数据库并将结果输出为 JSON 响应。
我打算在此端点上使用过滤器。例如/api/v2/matches?filter[team]=TeamId
在我的代码中筛选这些数据库结果的最佳way/most性能方法是什么?
我应该:
查询数据库中的所有内容,并在我的结果数组上使用
Array.prototype.filter()
或类似的方法来正确过滤数据。Assemble 我的查询字符串以编程方式,取决于传递给
req.query.filters
对象的内容并查询数据库。
请记住,我当前对此端点的查询(returns 所有结果的查询)有几个 INNER JOINS
正在进行。我也在这个查询中使用 LIMIT 50
。
磁盘访问时间和数据传输是这里的主要瓶颈。但是,LIMIT 50
对此有一个有趣的含义。您应该在数据库查询中使用过滤器,因为它会限制数据库花费在搜索上的时间,如果您的数据库是远程的,它还会限制传输的数据量(如果您的数据库不在远程,收益会更小但还在那里)。与此相比,构建查询所产生的轻微开销可以忽略不计。
SELECT *
查询当然是为速度而设计的,但是您的 DBMS 必须覆盖整个数据集。使用 SELECT WHERE
可以获得更好的执行时间,特别是如果您在数据库模式中提供适当的索引,因为即使使用 JOIN,您也只能获得 50 个结果。
此外,请记住,SELECT WHERE
查询背后有多年的研究和加速它们的技巧,而 Array.prototype.filter 可能是 "if (lambda(x)) arr.append(x)" 的一个非常简单的实现或类似的东西。几乎所有公司都使用它而不是 filter
.