MySQL批量导入CSV:一次性导100万行vs分批导入哪个更优?
MySQL批量导入大型CSV:单批次与分批次导入的差异分析
针对2000万行CSV的导入场景,对比一次性导入100万行与拆分为100万/10万/1万行分批次导入的核心差异如下:
1. 性能表现
- 一次性导入100万行:由于减少了
LOAD DATA INFILE语句的执行开销(如SQL解析、连接初始化等),且无需额外的文件拆分操作,整体导入速度最快,总耗时最短。 - 拆分小批次(10万/1万行):每次导入都存在语句执行的固定开销,加上文件拆分的前置耗时,总导入效率会明显低于单批次。批次越小,累计的额外开销越高,总耗时越长。
2. 服务器资源占用
- 一次性导入100万行:会瞬间占用大量内存(如buffer pool、排序缓冲区)、磁盘IO及CPU资源,可能导致服务器负载骤增,若服务器配置一般或有其他业务运行,易引发性能瓶颈。
- 拆分小批次:资源占用更平缓,不会短时间内打满服务器资源,对线上其他业务的影响更小,适合资源有限或业务不间断的场景。
3. 容错与故障恢复
- 一次性导入100万行:若中途出现数据格式错误、磁盘IO异常等问题,整个批次会失败,需重新导入全部100万行,排查错误行的难度也更大。
- 拆分小批次:出错范围仅限于当前批次,仅需重新导入出错的小批次即可;且批次越小,越容易定位到具体的错误行,故障恢复成本更低。
4. 锁与业务影响
- 一次性导入100万行:若使用事务包裹导入操作,事务规模大,锁表(或行锁)时间长,会导致目标表的读写操作被长时间阻塞(尤其是MyISAM引擎的表锁场景)。
- 拆分小批次:每个批次的事务规模小,锁持有时间短,对目标表的读写影响更小,能降低对业务的干扰。
5. 操作复杂度
- 一次性导入100万行:操作简单,无需预处理,直接执行单条
LOAD DATA INFILE语句即可。 - 拆分小批次:需先拆分CSV文件(如使用
split -l 100000 large.csv命令),再编写脚本循环执行导入,操作步骤多,还需注意避免拆分时截断行数据的问题,复杂度更高。
最优方案建议
- 离线环境/服务器资源充足:优先选择一次性导入100万行,最大化导入效率。
- 线上环境/有其他业务运行:建议采用10万行左右的批次,平衡导入速度与资源占用,减少对业务的影响。
- 数据质量不稳定:选择1万行的小批次,降低故障恢复成本,便于排查数据问题。
内容的提问来源于stack exchange,提问作者thuận bùi
相关产品推荐
相关产品推荐

