我有一个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
。
答案 0 :(得分:1)
磁盘访问时间和数据传输是这里的主要瓶颈。但是,LIMIT 50
对此有一个有趣的含义。您应该在数据库查询中使用过滤器,因为它将限制数据库花费在搜索上的时间,并且如果您的数据库是远程的,它也将限制传输的数据量(如果您的数据库不是远程的,则收益会更小但是还在那儿)。与此相比,构建查询所产生的轻微开销可以忽略不计。
SELECT *
查询肯定是为速度而设计的,但您的DBMS必须覆盖整个数据集。使用SELECT WHERE
可以获得更好的执行时间,尤其是如果您在数据库模式中提供了适当的索引,因为您的结果限制为50,即使使用JOIN也是如此。
另外,请记住,SELECT WHERE
查询经过多年的研究已有数年的时间和技巧可以加速它们,而Array.prototype.filter可能是一个非常简单的实现" if(lambda) (x))arr.append(x)"或类似的东西。这是一个很好的理由,几乎每个公司都使用它而不是filter
。