往mysql导入1000万数据?PHP批量插入提速5倍!高效导入,PHP助力MySQL批量插入数据提速5倍

项目上线前夜,导入百万数据卡成PPT?? ​​某程序员因用错方法,通宵跑数据被老板骂到崩溃​​!今天手撕MySQL千万级导入的5大野路子,连 ​​PHP批量插入的隐藏BUG​​ 都给你扒光?


一、文件直灌法:LOAD DATA INFILE 真能秒开?

​反常识结论​​:

*** 说LOAD DATA INFILE导入1000万数据只要 ​​10秒​​?实测远程服务器可能卡 ​​6分钟​​!

往mysql导入1000万数据?PHP批量插入提速5倍!高效导入,PHP助力MySQL批量插入数据提速5倍  第1张

​核心原理​​:

✅ 跳过SQL解析 → 直接文件灌入表

✅ 但需满足 ​​三大前提​​:

  1. 文件必须在数据库服务器本地(否则走网络=龟速)

  2. MySQL配置开启 local_infile=ON

  3. 文件格式严格匹配(逗号分隔/引号包裹)

​骚操作​​:

把CSV压缩成 ​​.gz格式​​ → 传输时间省 ​​70%​​ → 再在服务器解压导入


二、PHP批量插入:小心内存撑爆!

? ​​经典翻车现场​

新手直接拼接10万条SQL → 内存溢出 ​​Fatal error​​!

​正确姿势​​:

php复制
// 分批次构建SQL   $batchSize = 5000; // 每批5000条  for ($i=0; $i<10000000; $i+=$batchSize) {$values = [];for ($j=0; $j<$batchSize; $j++) {$values[] = "('data{$i}')";}$sql = "INSERT INTO table VALUES ".implode(',', $values);$pdo->exec($sql);}

​致命细节​​:

→ 必须开事务!否则每条INSERT自动提交 → 磁盘写爆

→ 用 PDO::ATTR_EMULATE_PREPARES关闭模拟预处理 → 速度 ​​翻倍​


三、参数调优:改3个值性能飙升

✅ ​​暴力配置法(适合临时导入)​

ini复制
# my.cnf 调整   innodb_buffer_pool_size = 4G    # 缓存池占内存70%  innodb_flush_log_at_trx_commit = 0  # 关日志刷盘(风险:断电丢数据)  max_allowed_packet = 256M       # 避免大SQL被截断

✅ ​​安全配置法(生产环境适用)​

ini复制
innodb_flush_log_at_trx_commit = 2  # 每秒刷1次日志  bulk_insert_buffer_size = 128M

? ​​四三法则​​:

调完参数必须重启MySQL → 改完不重启=白干!


四、临时表中转术:绕开索引拖累

​适用场景​​:

表有 ​​5个以上索引​​ → 直接导入慢如蜗牛?

​操作步骤​​:

  1. 建临时表 → ​​禁用所有索引​

  2. 数据灌入临时表(速度 ​​提升8倍​​)

  3. INSERT INTO 主表 SELECT * FROM 临时表

  4. 分批提交(每10万条1次)避免锁表

​魔幻现实​​:

某电商平台用这招 → 导入时间从 ​​2小时缩至9分钟​​!


五、多线程导入:小心锁冲突崩库!

? ​​Python多线程示例​

python下载复制运行
from threading import Threadimport pymysql# 每个线程导入200万  def import_data(start, end):conn = pymysql.connect(host='localhost')cursor = conn.cursor()for i in range(start, end):cursor.execute(f"INSERT INTO data VALUES ({i})")if i % 10000 == 0:conn.commit()  # 分段提交  conn.close()# 启动5个线程  threads = []for i in range(5):t = Thread(target=import_data, args=(i*2000000, (i+1)*2000000))t.start()threads.append(t)for t in threads:t.join()

​血泪避坑​​:

→ 线程数 ​​不要超过CPU核数​​(否则争抢资源更慢)

→ 不同线程必须操作 ​​不同数据范围​​(否则 *** 锁)


暴论:慢的方法反而更安全?

​反逻辑真相​​:

▶️ 单条INSERT虽慢 → 但 ​​边导边用​​(用户无感知)

▶️ LOAD DATA超快 → 但 ​​锁全表​​ → 导完才能访问

? ​​灵魂暴击​​:

​凌晨3点导数据?​

不如用“慢速插入” → 白天直接干 → 系统照常转!