温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么优化批量插入

发布时间:2026-09-01 22:16:40 来源:亿速云 阅读:103 作者:小樊 栏目:数据库

“批量插入”常见于数据库(MySQL、PostgreSQL、Oracle、MongoDB 等)或文件/消息写入场景。下面从通用原则 → 不同数据库示例 → 常见坑给你一套可落地的优化思路。


一、通用优化原则(最重要)

1. 减少网络往返

❌ 一条一条插
✅ 一次插入多条(单条 SQL 多值 / 批量 API)

2. 减少事务开销

  • 把多行放在一个事务
  • 避免每行一个 commit

3. 临时关闭约束和索引(大批量时)

  • 先插数据
  • 再建索引 / 开约束

4. 关闭自动提交

autocommit = false

5. 合理批次大小

  • 一般 500~5000 行/批
  • 太大:内存爆、锁时间长
  • 太小:网络往返多

二、各数据库批量插入优化示例

✅ MySQL

INSERT INTO user (name, age)
VALUES
('a', 1),
('b', 2),
('c', 3);

优化建议

  • 使用 PreparedStatement + addBatch()
  • 关闭 autocommit
  • 大批量时:
SET autocommit=0;
-- 插入
COMMIT;

✅ PostgreSQL

INSERT INTO user (name, age)
VALUES
('a', 1),
('b', 2);

或 COPY(最快):

COPY user(name, age) FROM '/data.csv' WITH CSV;

✅ Oracle

INSERT ALL
  INTO t VALUES (1, 'a')
  INTO t VALUES (2, 'b')
SELECT 1 FROM dual;

或使用:

  • PreparedStatement.addBatch()
  • SqlLoader

✅ MongoDB

db.users.insertMany([
  { name: "a" },
  { name: "b" }
]);

优化:

  • 分批 insertMany
  • 写关注调低(非核心数据)
{ w: 0 }

三、Java 示例(PreparedStatement 批量)

conn.setAutoCommit(false);
PreparedStatement ps = conn.prepareStatement(
  "INSERT INTO user(name, age) VALUES(?, ?)"
);

for (User u : list) {
    ps.setString(1, u.name);
    ps.setInt(2, u.age);
    ps.addBatch();

    if (++count % 1000 == 0) {
        ps.executeBatch();
    }
}
ps.executeBatch();
conn.commit();

四、常见性能坑

问题 原因 解决
插入慢 每行一个事务 批量提交
CPU 高 索引太多 先插后建
锁等待 批次太大 减小批次
内存 OOM List 太大 流式 / 分批

五、如果你愿意,我可以更具体

你可以告诉我:

  1. 用什么数据库?
  2. 数据量(万 / 百万 / 千万)?
  3. 语言(Java / Python / Go)?
  4. 是接口写入还是文件导入?

我可以直接给你可抄的优化方案或代码

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI