MySQL批量插入的两种写法:为什么你的10万条数据导入慢如蜗牛?
今天帮朋友排查一个数据迁移问题,发现他用的批量插入写法让我直摇头。同样的10万条数据,错误写法跑了3分钟,优化后只要8秒,差距实在太大。
错误示范: ```php foreach ($dataList as $item) { $db->query("INSERT INTO users VALUES ( '{$item['name']}', '{$item['email']}', '{$item['phone']}' )"); } ```
这种写法有三个致命伤: 1. 每次循环都建立新连接 2. 没有使用预处理防注入 3. 每条SQL独立提交事务
正确姿势应该是: ```php $values = []; foreach ($dataList as $item) { $values[] = "('".$db->escape($item['name'])."', '".$db->escape($item['email'])."', '".$db->escape($item['phone'])."')"; } $db->query("INSERT INTO users VALUES ".implode(',', $values)); ```
核心优化点: 1. 单条SQL完成所有插入 2. 统一进行数据转义 3. 自动使用事务提交 4. 减少网络往返开销
实测数据量越大差距越明显,当数据量上百万时,错误写法可能导致数据库连接池爆满。建议超过1000条的批量操作都要考虑这种优化,特别是做数据迁移的时候。


QQ官方交流群