【问题标题】:Best way to preforms queries on large array in NodeJS在 NodeJS 中对大型数组执行查询的最佳方法
【发布时间】:2020-12-17 08:11:27
【问题描述】:

我目前在我的 Postgres 数据库中有一个大约 115k 行的表,我觉得这对于我的无服务器功能来说太慢了。我唯一需要该表的就是使用 ILIKE 之类的函数查找值,我相信网络障碍会大大减慢速度。

我的想法是把桌子变成一个javascript对象数组,因为它不会经常改变。现在我将它放在一个文件中,例如 array.ts,里面是:

export default [
{}, {}, {},...
]

查询这个庞大数组的最佳方法是什么?最好只使用 .filter 功能吗?我目前正在尝试导入数组并对其进行过滤,但它似乎只是挂起并且从未真正完成。当前的数据库方法要慢得多,所以我不确定这是否是正确的方法。

【问题讨论】:

  • 115K 长度的对象数组根本不是一个好主意。管理它将是一个更大的问题,甚至比现在更糟。如果网络是你的瓶颈,你为什么不升级网络?
  • 如果不确定瓶颈是网络,可以通过db工具解释查询,这样可以判断查询本身是否慢。
  • @hellikiam 如果我在本地运行查询,大约需要 50-100 毫秒,这对我的用例来说很好。问题出在云功能上,它需要大约 300 毫秒 - 500 毫秒,这比我想要的要慢。数据库存储在谷歌计算引擎上,访问是通过谷歌云功能完成的,所以我认为我无法真正升级网络。
  • 1.那是网络响应时间还是数据库查询类型? 2.升级你的云计算资源也是不可能的?
  • 我觉得你的计划太危险了兄弟。请不要在代码级别执行此操作,而是在其他级别执行此操作

标签: node.js arrays database performance


【解决方案1】:

让数据库更快

正如人们所评论的那样,鉴于数据库擅长索引大型数据集,该数据库实际上可能会比其他任何东西都表现得更好。这可能只是添加正确索引或更改无服务器函数处理连接池的方式的情况。

使本地文件更快

如果您想在没有数据库的情况下执行此操作,有几件事会产生重大影响:

  1. 读取文件然后使用JSON.parse,不要使用require(...)

JavaScript 的解析比 JSON 慢得多。因此,您可以通过将其解析为 JavaScript 来加快加载速度。

  1. 找到拆分数据的方法

特别是在无服务器环境中,您不太可能需要每个请求的所有数据,并且无服务器功能可能只会在关闭并启动新请求之前处理几个请求。

如果您可以将文件拆分成通常只需要加载包含 1,000 个左右项目的数组,那么运行速度会更快。

根据对象的大小,您可以考虑创建一个文件,其中仅包含对象的 id 和过滤它们所需的字段,然后为每个对象创建一个单独的文件,这样您就可以在之后加载完整的对象已过滤。

使用本地数据库

如果问题确实是网络延迟,并且您找不到分割文件的好方法,您可以尝试使用本地数据库引擎。

@databases/sqlite 可用于查询 SQLite 数据库文件,您可以使用值数组和适当的索引预先填充该文件。

const openDatabase = require('@databases/sqlite');
const {sql} = require('@databases/sqlite');

const db = openDatabase('mydata.db');

async function query(pattern) {
  await db.query(sql`SELECT * FROM items WHERE item_name LIKE ${pattern}`);
}

query('%foo%').then(results => console.log(results));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2014-04-20
    • 1970-01-01
    • 2019-09-05
    • 2015-12-14
    相关资源
    最近更新 更多