温馨提示×

温馨提示×

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

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

批量插入如何更快

发布时间:2026-10-14 01:33:45 来源:亿速云 阅读:91 作者:小樊 栏目:数据库

“批量插入如何更快”取决于你使用的数据库 / 中间件 / 场景,但核心思路是高度一致的。下面从通用原则 → 分数据库实践 → 常见坑三个层面说明。


一、通用加速原则(最重要)

1️⃣ 减少网络往返(RTT)

❌ 一条一条 INSERT ✅ 一次插入多行

-- 慢
INSERT INTO t VALUES (1);
INSERT INTO t VALUES (2);

-- 快
INSERT INTO t VALUES (1),(2),(3),...;

经验值:单批 500~5000 行通常最优(太少没意义,太大易锁表)


2️⃣ 关闭/延迟约束与日志(谨慎)

  • 临时关闭索引(ALTER TABLE ... DISABLE KEYS)
  • 关闭 autocommit
  • 减少 binlog / redo 压力(仅限导入场景)

3️⃣ 使用事务批量提交

START TRANSACTION;
-- 插入 N 条
COMMIT;

❌ 每条都提交
✅ 每 1000~5000 条提交一次


4️⃣ 关闭自动提交 & 减少锁竞争

  • 使用 批量连接池
  • 避免行锁升级为表锁
  • 按主键顺序插入(减少页分裂)

5️⃣ 禁用或延迟索引

插入前:

ALTER TABLE t DISABLE KEYS;
-- 插入
ALTER TABLE t ENABLE KEYS;

(MySQL MyISAM 特别有效,InnoDB 效果有限)


二、不同数据库具体做法

✅ MySQL

  • 使用 INSERT INTO ... VALUES (),(),()
  • 使用 LOAD DATA INFILE(最快)
LOAD DATA INFILE 'data.csv'
INTO TABLE t
FIELDS TERMINATED BY ',';
  • 调大:
innodb_buffer_pool_size
innodb_log_file_size

✅ PostgreSQL

  • 使用 COPY(最快)
COPY t FROM 'data.csv' WITH CSV;
  • 或 INSERT ... VALUES (),()
  • 使用 unlogged 表(导入后转 logged)

✅ Oracle

  • 使用 INSERT ALL
INSERT ALL
INTO t VALUES (1)
INTO t VALUES (2)
SELECT 1 FROM dual;
  • 或使用 SQL*Loader
  • 使用 APPEND hint(直接路径插入)

✅ Redis

  • 使用 Pipeline
pipe = r.pipeline()
for k, v in data:
    pipe.set(k, v)
pipe.execute()

✅ Elasticsearch

  • 使用 _bulk API
  • 批量大小 5–15 MB

三、常见性能陷阱

❌ 在插入时建索引
❌ 使用 ORM 单条 save
❌ 每插入一条就查一次
❌ 大事务锁表
❌ 批量过大导致 OOM


四、推荐“黄金组合”

文件导入 + 禁用索引 + 事务批量 + 合理批大小

如果你是:

  • Java / Python / Go
  • MySQL / PG / ES
  • 单表 / 分库分表

可以告诉我具体技术栈和数量级(如 1000 万行),我可以直接给你可落地代码方案。

向AI问一下细节

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

AI
助
手