HoRain云--MySQL高效插入数据终极指南
2026/6/10 3:57:15 网站建设 项目流程

🎬 HoRain 云小助手:个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

目录

⛳️ 推荐

姿势一:单条 SQL 插入多行(性能首选 ⚡)

示例 1:使用 mysqli 预处理语句(安全可靠)

示例 2:使用 PDO(极度优雅,强烈推荐 ✨)

姿势二:使用事务批量提交(大数据量救星 🐘)

核心步骤:关自动提交 ➡️ 循环插入 ➡️ 统一提交

💡 避坑指南 & 性能极限测试


向 MySQL 插入多条数据时,最核心的原则就是:能一次搞定,绝不循环 N 次。频繁地与数据库建立连接和执行单条 SQL 会带来巨大的性能开销。

在实际开发中,我们通常有两种“偷懒且高效”的姿势:单条 SQL 包揽所有数据​ 或开启事务批量提交。下面我以最常用的mysqli(面向对象)和PDO为例,手把手教你如何优雅地实现。


姿势一:单条 SQL 插入多行(性能首选 ⚡)

这是最高效的做法。我们把多条数据拼接到一条INSERT语句中,只和数据库通信一次。

示例 1:使用 mysqli 预处理语句(安全可靠)

预处理语句能有效防止 SQL 注入,是生产环境的标配。

<?php $servername = "localhost"; $username = "root"; $password = "你的密码"; $dbname = "MyDB"; // 记得换成你的数据库名 // 1. 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 2. 检测连接 if ($conn->connect_error) { die("连接失败:" . $conn->connect_error); } // 3. 准备待插入的数据(通常是从表单或 API 获取的二维数组) $users = [ ['张三', 'zhangsan@example.com'], ['李四', 'lisi@example.com'], ['王五', 'wangwu@example.com'] ]; // 4. 构建 SQL 预处理语句(使用占位符 ?) $sql = "INSERT INTO users (name, email) VALUES (?, ?)"; $stmt = $conn->prepare($sql); // 绑定参数(类型说明:'s'代表字符串,如果是整数用'i') $stmt->bind_param("ss", $name, $email); // 5. 循环遍历数组,执行预处理语句 foreach ($users as $user) { $name = $user[0]; $email = $user[1]; $stmt->execute(); echo "🎉 {$name} 插入成功!<br>"; } // 6. 关闭资源 $stmt->close(); $conn->close(); ?>
示例 2:使用 PDO(极度优雅,强烈推荐 ✨)

如果你用的是 PDO,那简直不要太爽,它的execute方法可以直接接收数组参数。

<?php try { $conn = new PDO("mysql:host=localhost;dbname=MyDB;charset=utf8mb4", "root", "你的密码"); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "INSERT INTO users (name, email) VALUES (:name, :email)"; $stmt = $conn->prepare($sql); $users = [ ['name' => '赵六', 'email' => 'zhaoliu@example.com'], ['name' => '孙七', 'email' => 'sunqi@example.com'] ]; foreach ($users as $user) { $stmt->execute($user); echo "🚀 {$user['name']} 插入搞定!<br>"; } echo "✅ 所有数据插入完毕!"; } catch(PDOException $e) { echo "💥 出错啦:" . $e->getMessage(); } $conn = null; ?>

姿势二:使用事务批量提交(大数据量救星 🐘)

如果你要一次性插入几千甚至上万​ 条数据,单条循环执行可能会把 MySQL 的连接打满。这时候就需要祭出大招——事务(Transaction)

事务可以把一系列操作打包成一个“原子操作”,要么全部成功,要么全部回滚,不仅保证了数据安全,还能让写入速度起飞。

核心步骤:关自动提交 ➡️ 循环插入 ➡️ 统一提交
<?php // ... 假设你已经建立了 $conn 数据库连接 ... try { // 1. 关闭自动提交(autocommit) $conn->begin_transaction(); $stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)"); $stmt->bind_param("ss", $name, $email); $bigData = [ /* 这里可能有一万条数据 */ ]; foreach ($bigData as $user) { $name = $user[0]; $email = $user[1]; $stmt->execute(); } // 2. 循环结束,统一提交给数据库 $conn->commit(); echo "🎊 事务提交成功,海量数据已全部入库!"; } catch (Exception $e) { // 3. 如果任何一条出错,立刻回滚,数据库里啥也不会留 $conn->rollback(); echo "😱 发生错误,已回滚所有操作:" . $e->getMessage(); } $stmt->close(); $conn->close(); ?>

💡 避坑指南 & 性能极限测试

  1. SQL 长度限制

    虽然单次INSERT插入多行很快,但 MySQL 有一个max_allowed_packet限制(默认通常是 16MB 或 64MB)。如果你一次性拼接了几万条数据,可能会触发这个限制导致报错。对于极大数据量,务必使用“事务 + 分批循环”

  2. 一定要用预处理

    千万别用古老的mysql_query或在循环里直接拼字符串(如"INSERT INTO users VALUES ('$name')"),这不仅是低效的,更是极其危险的(SQL 注入漏洞)。

总结一下

你可以根据自己的业务场景把上面的代码模板直接复制过去改改就能用!如果有具体的表结构或者报错,随时丢给我帮你排雷。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询