批量插入 100 条数据,普通方式发送 100 次 SQL,MySQL 需解析、编译、优化、执行 100 次。预处理:
? 的 SQL,MySQL 编译生成执行计划<?php
$mysqli = new MySQLi('localhost', 'root', '123456', 'test');
if ($mysqli->connect_error) die($mysqli->connect_error);
$mysqli->set_charset('utf8mb4');
$sql = 'INSERT INTO account (id, balance) VALUES (?, ?)'; // id 自增传 null
$stmt = $mysqli->prepare($sql); // 编译阶段
// 第一条
$id = null; $balance = 100.5;
$stmt->bind_param('id', $id, $balance); // 'i'=int, 'd'=double
$stmt->execute() or die('Insert failed: ' . $stmt->error);
// 第二条
$balance = 400.3;
$stmt->bind_param('id', $id, $balance); // 重新绑定新值
$stmt->execute() or die('Insert failed: ' . $stmt->error);
$stmt->close();
$mysqli->close();
?>
| 字符 | 对应 PHP 类型 |
|---|---|
| i | integer |
| d | double/float |
| s | string |
| b | blob (需配合 send_long_data) |
<?php
// 更新
$upd = $mysqli->prepare('UPDATE account SET balance = ? WHERE id = ?');
$upd->bind_param('di', $bal, $id);
foreach ($data as $row) {
$bal = $row['balance']; $id = $row['id'];
$upd->execute();
}
// 删除
$del = $mysqli->prepare('DELETE FROM account WHERE id = ?');
$del->bind_param('i', $id);
foreach ($ids as $id) { $del->execute(); }
?>
| 方式 | 耗时(约) | 网络往返 |
|---|---|---|
| 普通 query 循环 | 2.5s | 10,000 次 |
| 预处理 + 循环 execute | 0.8s | 10,000 次 |
| 预处理 + 单条多值 INSERT | 0.15s | 1 次 |
极致性能:INSERT INTO t (a,b) VALUES (?,?), (?,?), ... 单次多值绑定,需动态生成占位符字符串。
prepare() 失败返回 false,需检查 $mysqli->errorbind_param 参数**必须是变量**,不能直接传表达式/字面量$mysqli->begin_transaction() ... commit()$mysqli->autocommit(false)