你是不是也遇到过这样的情况:要往ref="/tag/426/" style="color:#874873;font-weight:bold;">数据库里塞几万条订单记录、上百万条日志,或者导出Excel后想批量导入到MySQL?手动写INSERT语句?复制粘贴一百次?等它跑完,泡的茶都凉了。
慢,是因为没用对方法
一条一条执行INSERT,本质是反复建立连接、解析SQL、写日志、刷磁盘。每条语句都是独立事务(默认),开销大得离谱。换成批量操作,效率能差十倍、百倍。
最常用又有效的几种法子
1. INSERT ... VALUES 多值插入
这是最轻量、兼容性最好的方式,适合几千条以内数据:
INSERT INTO users (name, email, age) VALUES
('张三', 'z3@demo.com', 28),
('李四', 'l4@demo.com', 32),
('王五', 'w5@demo.com', 25);注意:单条语句别太长,MySQL 默认 max_allowed_packet 是4MB,超了会报错。可以分批,比如每次插1000行。
2. LOAD DATA INFILE(本地文件直入)
如果你有CSV或TXT文件,这是最快的——绕过SQL解析,直接读文件进表:
LOAD DATA INFILE '/tmp/users.csv'
INTO TABLE users
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(name, email, age);前提:MySQL服务端能读到这个路径;本地模式下可用 LOAD DATA LOCAL INFILE(需客户端开启)。
3. 使用事务包住多条INSERT
不改语句结构,只加个“包裹”动作,适合已有代码微调:
BEGIN;
INSERT INTO logs (msg, time) VALUES ('启动成功', '2024-06-10 09:00:00');
INSERT INTO logs (msg, time) VALUES ('用户登录', '2024-06-10 09:00:03');
INSERT INTO logs (msg, time) VALUES ('下单完成', '2024-06-10 09:00:08');
COMMIT;把1000条INSERT塞进一个事务,比1000个独立事务快得多。
顺手提一句:别在PHP/Python里拼SQL
有人用循环+字符串拼接生成大段INSERT,看着省事,其实危险又低效。参数化预处理+批量绑定才是正解。比如Python用pymysql的executemany():
data = [('赵六', 'z6@demo.com', 30), ('孙七', 's7@demo.com', 27)]
cursor.executemany(
"INSERT INTO users (name, email, age) VALUES (%s, %s, %s)",
data
)既防SQL注入,又由驱动自动优化发送节奏。
说到底,大批量插入不是“能不能做”,而是“选哪条路更快更稳”。按数据来源选:本地文件就上LOAD DATA;程序生成就走事务或executemany;临时凑几条就多值INSERT——手熟了,几分钟搞定十万条,真不费劲。