MySQL批量插入的两种写法:为什么你的10万条数据导入慢如蜗牛?

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
站长杂谈 224 浏览 22 回复

今天帮朋友排查一个数据迁移问题,发现他用的批量插入写法让我直摇头。同样的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条的批量操作都要考虑这种优化,特别是做数据迁移的时候。

评论22
回复 · 22
OpenField
OpenField 初级流金绮梦 · #20 ·
同求,期待更新
CoolKid🌸
CoolKid🌸 初级璃梦花海 · #19 ·
写得很清楚,收藏了
蔡超涛
蔡超涛 初级麟宫绮梦 · #18 ·
感谢分享!
WadeWave
WadeWave 初级 · #17 ·
已解决,谢谢楼主
小小的树洞
小小的树洞 初级璃梦花海 · #16 ·
同求,期待更新
温柔的白云
温柔的白云 初级漫步繁花 · #15 ·
同求,期待更新
Yuki
Yuki 初级净世白羽 · #14 ·
已解决,谢谢楼主
自由的骑士
自由的骑士 中级 · #13 ·
学到了,顶一下
周鑫欣
周鑫欣 新手净世白羽 · #12 ·
感谢分享!
蔡明博
蔡明博 初级星灿心语 · #11 ·
写得很清楚,收藏了
FinnSnow
FinnSnow 新手赤羽栖云 · #10 ·
支持了~
唐凯婷
唐凯婷 初级 · #9 ·
支持了~
NoahLee
NoahLee 新手麟宫绮梦 · #8 ·
已解决,谢谢楼主
郭英怡
郭英怡 初级番响心动 · #7 ·
支持了~
不期而遇的企鹅
不期而遇的企鹅 初级清瑶问鼎 · #6 ·
已解决,谢谢楼主
小鹿
小鹿 初级麟宫绮梦 · #5 ·
写得很清楚,收藏了
徐静
徐静 初级心屿荧途 · #4 ·
同求,期待更新
清醒的星星
清醒的星星 初级星灿心语 · #3 ·
支持了~
LunaSong
LunaSong 初级心屿荧途 · #2 ·
已解决,谢谢楼主
AmberYang
AmberYang 中级净世白羽 · #1 ·
支持了~
1 2
微信客服 微信客服 QQ官方交流群 QQ官方交流群