我有一个mysql数据库,其中包含来自api的数据,假设它有一个名为gameid的字段,这个字段是唯一的,每当有新的数据来自api时,我运行一个查询并选择所有的gameid,然后用JS(Node JS)中的Array.Filter()方法过滤掉数据库中不存在的、api中存在的数据,并将唯一的数据存储在数据库中
有点像
let filtered_data=datafromapi.filter(data=>!mysqldata.includes(data.gameid))
但由于有近3万条记录,这需要很多时间,你知道如何用mysql和node js来完成这个过程吗。

最佳答案

让我们从这一行代码中回顾一下代码的一些要求和可观察的规则:
你收到的东西最终会映射成一系列结构,如下所示:

{
  "data": ["game_ids"]
}

您要根据另一个数组的内容进行筛选,mysqldata
假设您不能更改API的返回格式,那么您可以利用数据的一个属性来优化至少一部分数据。
您的API返回是一个独立对象的列表。你可以利用这个优势,因为你只需要对每个过滤器执行一个操作。如果您可以让API调用返回一个Reader而不是一个容易解析的JSON对象,那么您可以通过使用streaming json parser而不是JSON.parse来利用这一点。
这种类型的解析器将返回一个令牌流,因为它通过数组进行过滤,而不是进行过滤然后返回一个块中的所有内容。
这不会极大地提高性能,因为代码的大部分时钟时间将用于等待网络请求完成和筛选本身(对Array.includes()的30k个调用,所有这些都是无法避免的),所以不要期待奇迹。
更好的方法
最好的方法是更改API端点(如果可能的话),因为这将允许您一次性解决两个问题:通过网络传输的数据更少,过滤所用的时钟周期更少。
你实际上是在做一个客户端(对于数据库,也就是说)WHERE gameid IN (...)。如果允许您修改API调用,您应该考虑到这一点。

09-16 07:52
查看更多