【问题标题】:Large SQL OR statement or filter in code?大型 SQL OR 语句或代码中的过滤器?
【发布时间】:2018-04-27 14:42:03
【问题描述】:

假设我有大量的 ID,大约 10,000 个项目长。每个 ID 都是由数字组成的唯一字符串,长度约为 20 个字符。

['438122955667406858', '427968416155041792', '427968416155041792', '387734570570743849'...]

我还有一个数据库表,其中 ID 对应于数组中的 ID。表中的 ID 不是唯一的,表中可以有多个 ID 匹配的行,如下所示:

所以问题来了:10,000 个 ID 的数组被分配到 10 个左右的进程中,所以每个进程都有它自己的份额 ~1000 个唯一 ID。每个进程必须从包含 20+k 个条目的数据库中请求其 ID 在进程的 ID 份额中的任何行。

最后一个问题是,构造一个大的 [Op.or] 语句是否更好,让 SQL 服务器来完成工作:

table.findAll({
    where: {
        guild: {
            [Op.or]: ThousandIDArray,
        }
    }
}).then(rows => rows.forEach(r => doSomething()))

或请求所有行,并按进程手动过滤?

table.findAll().then(rows => {
    rows.forEach(r => {
        if (ThousandIDArray.includes(r.guild)) doSomething();
    })
})

【问题讨论】:

  • 公会ID被索引了吗?
  • 让db做处理;不要通过网络返回所有数据
  • @RaymondNijland 公会 id 在数据库或数组中都没有索引,它们的顺序和随机一样好。

标签: javascript mysql sql node.js sequelize.js


【解决方案1】:

如果我正确理解了您的问题,那么您不会通过将工作分成 1000 个 id 的集合来节省任何东西。将所有感兴趣的 id 放在一个数组中并执行以下操作会更简单:

let result = await [model].findAll({
    where: {
        [Op.in]: [uuid, uuid, uuid, uuid, ...]
    }
});

Sequelize Operators

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2013-08-19
    • 2012-08-20
    • 2016-05-06
    相关资源
    最近更新 更多