大量のデータ挿入操作を処理する場合、 INSERTステートメントをループする効率が低くなります。パフォーマンスを改善するために、 mysqli :: stmt_initとbind_param()を使用して、プリプロセッスされたステートメントのバッチ実行を実装できます。この記事では、この操作を例で効率的に実行する方法について説明します。
prepare + bind_paramの使用は、従来の文字列スプライシング方法よりも安全であり、より動的なパラメーターを備えた状況に特に適しています。その利点は次のとおりです。
SQL注入は避けてください。
実行効率を改善するために、SQLの繰り返しの編集を避けてください。
優れた読みやすさと明確な構造。
単純なユーザー情報テーブルユーザーを例として受け取ります。その構造は次のとおりです。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(100)
);
複数のユーザーレコードを挿入する必要があると仮定します。以下は完全なPHP実装です。
<?php
// データベース接続構成
$mysqli = new mysqli("localhost", "db_user", "db_pass", "db_name");
// 接続を確認してください
if ($mysqli->connect_errno) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
// ステートメントオブジェクトを初期化します
$stmt = $mysqli->stmt_init();
// 準備する SQL 声明
$sql = "INSERT INTO users (username, email) VALUES (?, ?)";
if (!$stmt->prepare($sql)) {
die("前処理に失敗しました: " . $stmt->error);
}
// バインドパラメーター(変数が参照されることに注意してください)
$stmt->bind_param("ss", $username, $email);
// 挿入するデータをシミュレートします
$data = [
["alice", "alice@m66.net"],
["bob", "bob@m66.net"],
["charlie", "charlie@m66.net"]
];
// バッチ挿入を実行します
foreach ($data as $row) {
$username = $row[0];
$email = $row[1];
if (!$stmt->execute()) {
echo "挿入障害: " . $stmt->error . "<br>";
}
}
$stmt->close();
$mysqli->close();
?>
$ mysqli-> prepare()略語を直接使用できますが、 STMT_INITを使用して、複雑なプロジェクトや大規模プロジェクトにより適したプロセスを明示的に表現できます。
bind_paramは変数への参照をバインドするため、変数の値をループ内で変更でき、毎回再バインドする必要はありません。
各execution()の後に返品値を確認すると、挿入に失敗したレコードをすばやく見つけることができます。
バッチの提出:大量のデータ挿入の場合、バッチ(1,000アイテムごとに1つのグループなど)で処理できます。
自動コミット( $ mysqli-> autocommit(false) )をオフにし、バッチが処理された後に均一にトランザクションを送信します。
多値の挿入構文(挿入...値(...)、(...)、...)を使用して、テストパフォーマンスの違いを比較します。
mysqli :: stmt_initおよびbind_param()を使用すると、バッチ挿入の効率を改善するだけでなく、アプリケーションのセキュリティと保守性も向上させます。この方法は、大量のユーザーデータやロギングなどのシナリオを扱う場合に特にお勧めします。