在数据库批量数据写入的场景中,COPY、INSERT多值和LOAD DATA是三种最常用的批量插入方案,它们的性能表现存在明显差异,实际选择需要结合数据库类型、数据规模和业务需求判断。

三种批量插入方式的基本原理
INSERT多值插入
INSERT多值插入是标准的SQL语法,通过一条INSERT语句携带多组值实现批量写入,兼容绝大多数关系型数据库,语法格式如下:
-- 插入3条用户数据 INSERT INTO user_info (id, name, age) VALUES (1, '张三', 20), (2, '李四', 22), (3, '王五', 25);
COPY命令
COPY是PostgreSQL、Greenplum等数据库特有的批量导入命令,支持从文件或者标准输入直接读取数据写入表,绕过部分SQL解析流程,效率更高,典型用法如下:
-- 从本地文件导入数据到user_info表 COPY user_info (id, name, age) FROM '/data/user.csv' WITH (FORMAT csv, HEADER true);
LOAD DATA命令
LOAD DATA是MySQL、MariaDB等数据库提供的原生批量导入工具,直接读取服务器本地或者客户端本地的文件数据写入表,执行流程更贴近底层存储,语法示例:
-- 从服务器本地文件导入数据 LOAD DATA INFILE '/data/user.csv' INTO TABLE user_info FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY 'n' IGNORE 1 ROWS;
性能对比测试
我们选取100万条用户测试数据,在同等硬件环境下(8核16G服务器,PostgreSQL 14、MySQL 8.0环境)对三种方式进行测试,结果如下:
| 插入方式 | PostgreSQL耗时 | MySQL耗时 | 单条语句最大支持行数 |
|---|---|---|---|
| INSERT多值 | 12.3秒 | 10.8秒 | 受SQL语句长度限制,通常几万行 |
| COPY | 2.1秒 | 不支持 | 无明确限制,可导入GB级文件 |
| LOAD DATA | 不支持 | 1.8秒 | 无明确限制,可导入GB级文件 |
不同场景的选择建议
- 如果数据量小于1万行,且需要兼容多种数据库,优先选择
INSERT_多值插入,实现简单无需额外文件操作。 - 如果使用PostgreSQL数据库,且数据量超过1万行,优先选择
COPY命令,性能优势明显且支持流式导入。 - 如果使用MySQL数据库,且数据量超过1万行,优先选择
LOAD_DATA命令,导入速度最快且对大文件支持更好。 - 如果数据需要跨网络传输且无法落地为文件,可使用INSERT多值分批插入,每批控制在1000-5000行,平衡性能和网络开销。
注意事项
使用COPY和LOAD DATA时需要注意文件权限问题,数据库进程需要有对应文件的读取权限。另外如果表上存在大量索引和触发器,三种方式的性能都会下降,建议导入前暂时禁用非必要索引,导入完成后再重建。如果插入过程中需要保证事务一致性,INSERT多值可以天然支持单语句事务,而COPY和LOAD DATA默认是自动提交的,需要手动开启事务包裹操作。