mysql批量插入最常用方式是insert into ... values多行插入,即单条语句包含多组括号值;万级以上数据推荐load data infile;处理重复键可用insert ignore或on duplicate key update;python中应使用executemany而非字符串拼接。

INSERT INTO ... VALUES 多行插入最常用
批量插入的本质是避免逐条 INSERT,核心就是把多组值塞进一条语句里。MySQL 原生支持在单条 INSERT 后跟多组括号,例如:
INSERT INTO users (name, email) VALUES ('Alice', 'a@x.com'), ('Bob', 'b@x.com'), ('Charlie', 'c@x.com');这样一次提交 3 行,比发 3 条语句快得多。但要注意:默认 max_allowed_packet 限制(通常 4MB),值太多会报错 Packets larger than max_allowed_packet are not allowed。建议单次控制在 1000 行以内,具体看字段长度——字符串越长,能塞的行数越少。
用 LOAD DATA INFILE 替代 INSERT 处理万级以上数据
当要导入几万甚至百万行时,INSERT ... VALUES 仍显慢,LOAD DATA INFILE 是 MySQL 官方推荐的高速通道。它直接从服务端文件读取文本(如 CSV),跳过 SQL 解析开销。使用前需确认:
- MySQL 配置中
secure_file_priv指向的目录(用SHOW VARIABLES LIKE 'secure_file_priv';查) - 文件必须放在该目录下,且 MySQL 进程有读权限
- 字段分隔符、换行符需与文件一致,例如:
LOAD DATA INFILE '/var/lib/mysql-files/data.csv' INTO TABLE users FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (name, email);
LOCAL 关键字(LOAD DATA LOCAL INFILE),需客户端和服务端都启用对应选项,且存在安全风险,很多生产环境禁用。
用 INSERT IGNORE 或 ON DUPLICATE KEY UPDATE 处理重复键
批量插入常遇到主键或唯一索引冲突。不加处理会中断整个语句。两种主流应对方式:
-
INSERT IGNORE:冲突时跳过当前行,其余继续执行,不会报错 -
INSERT ... ON DUPLICATE KEY UPDATE:冲突时执行更新逻辑,比如INSERT INTO logs (url, count) VALUES ('/api', 1) ON DUPLICATE KEY UPDATE count = count + 1;
VALUES() 中出现的列,否则报错 Unknown column 'xxx' in 'field list'。另外,IGNORE 会静默吞掉其他错误(如数据截断),调试时容易掩盖问题。
Python 批量插入别直接拼 SQL 字符串
用 Python(如 pymysql 或 mysql-connector-python)时,常见错误是用 str.format 或 f-string 拼接 VALUES 列表。这既危险(SQL 注入),又难控长度。正确做法是交给驱动处理:
cursor.executemany("INSERT INTO users (name, email) VALUES (%s, %s)", [('Alice','a@x.com'), ('Bob','b@x.com')])注意:executemany 在底层仍是多条语句(非单条多值),性能略低于手写 VALUES (...),(...),但更安全、易维护。若追求极致速度,可手动组装多值语句,但务必用驱动的参数占位符(%s)做绑定,绝不要字符串拼接用户输入。
真正卡住人的往往不是语法,而是 secure_file_priv 路径限制、max_allowed_packet 溢出、或唯一约束没提前建好导致整批失败。动手前先查配置,小批量试跑,再扩量。











