Node.js MySQL2依赖包, 同步插入大量数据时为何只插入了部分数据且没有报错是什么情况?

nodejs mysql2的依赖包, 5w数据, for 循环插入, 然后我需要获取插入的 成功的 自增id 来 进行另一个操作, 但是执行完 直插入了 2w不到, 也没有报错 是什么情况导致的? 我是 同步执行 插入的

image.png

查询网上 基本 都是 一次性插入 大量数据, 我主要想知道我这个情况是因为什么 这种方式有 优化方案吗

阅读 1.3k
avatarAI BotBETA

在Node.js中使用MySQL2库进行大量数据的同步插入时,遇到只插入了部分数据且没有报错的情况,通常与以下几个因素有关:

  1. 数据库连接超时:如果数据库连接在长时间的操作中没有得到响应,可能会因为超时而被关闭。虽然MySQL2库默认有连接池管理,但在极端情况下(如网络延迟、数据库负载过高等),仍有可能发生。
  2. 事务超时或限制:如果你是在一个事务中执行这些插入操作,事务可能因为达到某个超时限制或资源限制而被中断。
  3. 内存限制:Node.js进程本身或MySQL服务器可能因为处理大量数据而耗尽内存,导致操作被中断或执行缓慢。
  4. 数据库锁:如果数据库表被其他操作锁定(如长时间运行的事务、锁表查询等),你的插入操作可能会被阻塞或延迟。
  5. 代码逻辑问题:虽然你提到是同步执行,但代码中可能存在逻辑错误,导致循环提前终止或数据未正确发送到数据库。

优化方案

  1. 批量插入
    使用批量插入(Bulk Insert)而不是单条记录插入。MySQL2支持通过执行一个包含多条INSERT语句的查询来批量插入数据。这可以显著减少网络往返次数和数据库操作次数。

    const sql = 'INSERT INTO table_name (column1, column2) VALUES ?';
    const values = [
        [value1a, value1b],
        [value2a, value2b],
        // 更多值...
    ];
    connection.query(sql, [values], function (error, results, fields) {
        if (error) throw error;
        // 处理结果
    });
  2. 调整数据库配置
    增加数据库连接超时时间、事务超时时间等配置,确保不会因为超时而中断操作。
  3. 使用事务
    如果数据之间有依赖关系,确保使用事务来保持数据的一致性。但注意事务也可能因为资源限制而失败。
  4. 监控和日志
    增加日志记录,监控数据库操作的状态和性能,以便在出现问题时能够快速定位原因。
  5. 异步处理
    虽然你提到需要同步执行,但考虑到性能和资源利用,使用异步方式(如Promise.all或async/await)来并发处理多个插入操作可能更为合适。这可以减少主线程的阻塞时间,提高整体性能。
  6. 检查数据库锁
    确保没有其他操作(如长时间运行的事务)锁定了你的表或行。
  7. 分批处理
    如果数据量非常大,考虑将数据分批处理,每批处理一定数量的数据,并在每批处理完成后进行必要的检查和清理工作。

通过上述方法,你应该能够解决只插入了部分数据且没有报错的问题,并优化你的数据插入性能。

1 个回答

如果你用了连接池,检查connectionLimit数值足够大;
如果你的插入操作是在事务中进行的,检查是否有BEGINCOMMIT语句;
确保你在每次调用插入函数时都使用await来等待其完成;
检查MYSQLmax_allowed_packet限制;
或者你可以考虑批量插入:

const sql = 'INSERT INTO your_table (column1, column2) VALUES ?';
const values = data.map(item => [item.value1, item.value2]);
await connection.query(sql, [values]);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏