LOAD DATA INFILE 是唯一能稳定1秒内导入10万行CSV的方法;需开启local_infile、检查secure_file_priv路径、设置max_allowed_packet和utf8mb4字符集,并用SHOW WARNINGS验证结果。

LOAD DATA INFILE 是唯一能稳定把 10 万条 CSV 在 1 秒内导入 MySQL 的方法。其他方式——包括 ORM 批量 save、多值 INSERT、甚至分 1000 条一批的事务提交——都卡在 SQL 解析、网络往返、权限校验或内存拼接上,实测耗时普遍在 30 秒到数分钟。
确认 MySQL 是否允许 LOAD DATA 操作
不提前检查这个,命令直接报错 ERROR 1148: The used command is not allowed with this MySQL version。
- 执行
SHOW VARIABLES LIKE 'local_infile';:若返回OFF,需服务端开启:SET GLOBAL local_infile = ON;(需 SUPER 权限) - 执行
SHOW VARIABLES LIKE 'secure_file_priv';:若返回非空路径(如/var/lib/mysql-files/),CSV 必须放在此目录下;若返回NULL,说明禁用所有文件导入;若为空字符串(''),才允许任意路径(需重启生效) - PHP 连接 MySQL 时,必须显式启用 local_infile:PDO 构造时加
PDO::MYSQL_ATTR_LOCAL_INFILE => true;mysqli 则需mysqli_options($conn, MYSQLI_OPT_LOCAL_INFILE, true)
用 LOAD DATA LOCAL INFILE 导入本地 CSV(最常用场景)
适用于你手头有 CSV 文件、但没服务器 SSH 权限(比如云数据库 RDS)的情况。文件由客户端上传,不依赖 secure_file_priv 路径限制。
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
- 确保 CSV 字段顺序与目标表列顺序严格一致,否则字段错位
- 导入语句必须显式指定字符集,否则中文全变问号:
LOAD DATA LOCAL INFILE '/path/data.csv' INTO TABLE orders CHARACTER SET utf8mb4 ... - 常见换行问题:Windows CSV 用
\r\n,Linux/macOS 用\n;写LINES TERMINATED BY '\n'在 Windows 上会漏最后一行,建议统一用LINES TERMINATED BY '\r\n'或让工具导出时选 Unix 换行 - 跳过标题行:加
IGNORE 1 LINES;跳过某列(比如 CSV 多了一列统计时间):用占位符@dummy,如(order_id, product_name, @dummy, amount)
避免 max_allowed_packet 和乱码的硬性设置
这两个不是“可选优化”,而是不设就必然失败的门槛。
-
max_allowed_packet默认通常为 4MB;10 万行 CSV 即使每行 200 字节也超了 20MB;必须调大:服务端执行SET GLOBAL max_allowed_packet = 128*1024*1024;(128MB) - 字符集必须三层对齐:MySQL 服务端配置
[mysqld] character-set-server=utf8mb4、连接层(PHP PDO 设置PDO::ATTR_CHARSET => 'utf8mb4')、导入语句中加CHARACTER SET utf8mb4;三者缺一,中文就丢 - 字段被双引号包裹且含逗号?必须加
FIELDS ENCLOSED BY '"';否则字段截断或解析崩溃
导入后立刻验证和清理的必要动作
导入成功不等于数据可用。尤其业务表带外键、唯一索引或 NOT NULL 约束时,LOAD DATA 默认会静默跳过非法行,不报错也不提示。
- 导入后立刻查
SELECT ROW_COUNT();—— 返回值才是真实插入行数,不是“Query OK”那行显示的数字 - 查错误日志:
SHOW WARNINGS;可看到哪些行因类型不匹配、截断、NULL 插入 NOT NULL 字段被跳过 - 如果目标表已有数据,且 CSV 含主键/唯一键,加
REPLACE或IGNORE控制冲突行为;不要依赖默认行为 - 暂存表(staging table)方案更安全:先导入宽表,再用
INSERT SELECT校验+转换+写入业务表,能拦截脏数据、补缺失字段、做关联映射
SHOW VARIABLES,比导入失败后查半小时日志高效得多。

















