HoRain云--MySQL高效插入数据终极指南
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 [ [张三, zhangsanexample.com], [李四, lisiexample.com], [王五, wangwuexample.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:hostlocalhost;dbnameMyDB;charsetutf8mb4, 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 zhaoliuexample.com], [name 孙七, email sunqiexample.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(); ? 避坑指南 性能极限测试SQL 长度限制虽然单次INSERT插入多行很快但 MySQL 有一个max_allowed_packet限制默认通常是 16MB 或 64MB。如果你一次性拼接了几万条数据可能会触发这个限制导致报错。对于极大数据量务必使用“事务 分批循环”。一定要用预处理千万别用古老的mysql_query或在循环里直接拼字符串如INSERT INTO users VALUES ($name)这不仅是低效的更是极其危险的SQL 注入漏洞。总结一下日常几十条数据用单条预处理循环 就够了。数据量极大且要求保证完整性比如财务数据果断上事务。你可以根据自己的业务场景把上面的代码模板直接复制过去改改就能用如果有具体的表结构或者报错随时丢给我帮你排雷。❤️❤️❤️本人水平有限如有纰漏欢迎各位大佬评论批评指正如果觉得这篇文对你有帮助的话也请给个点赞、收藏下吧非常感谢! Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧