首页 > 解决方案 > 在 NodeJS 中对大型数组执行查询的最佳方法

问题描述

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

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

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

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

标签: node.jsarraysdatabaseperformance

解决方案


让数据库更快

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

使本地文件更快

如果你想在没有数据库的情况下这样做,有几件事会产生很大的不同:

  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));

推荐阅读