ホームページ > データベース > mysql チュートリアル > 速度とセキュリティのために MySQLi への一括データ挿入を最適化するにはどうすればよいですか?

速度とセキュリティのために MySQLi への一括データ挿入を最適化するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-31 13:28:11
オリジナル
768 人が閲覧しました

How Can I Optimize Bulk Data Insertion into MySQLi for Speed and Security?

MySQLi での一括値挿入のための拡張テクニック

大量の値を MySQL データベースに安全に挿入するというタスクに直面した場合、開発者は多くの場合、準備されたステートメントを繰り返し使用しますが、大規模なデータセットでは時間がかかる可能性があります。この記事では、SQL インジェクションのセキュリティを損なうことなくパフォーマンスを向上させる手法について説明します。

問題: スタック オーバーフローと挿入の遅さ

一般的なアプローチは、プリペアド ステートメントを内部で利用することです。ループして各値を個別に挿入します。ただし、データセットが大きい場合、この方法ではスタック オーバーフローが発生したり、実行時間が遅くなる可能性があります。

$array = ["array", "with", "about", "2000", "values"];

foreach ($array as $one) {
    $query = "INSERT INTO table (link) VALUES (?)";
    $stmt = $mysqli->prepare($query);
    $stmt->bind_param("s", $one);
    $stmt->execute();
    $stmt->close();
}
ログイン後にコピー

解決策: トランザクションと最適化された実行

上記のコードを使用すると、トランザクションを組み合わせて実行を改善できます。戦略:

$array = ["array", "with", "about", "2000", "values"];
$query = "INSERT INTO table (link) VALUES (?)";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("s", $one);

$mysqli->query("START TRANSACTION");
foreach ($array as $one) {
    $stmt->execute();
}
$stmt->close();
$mysqli->query("COMMIT");
ログイン後にコピー

実装の詳細:

  • トランザクション: 値を挿入する前にトランザクションを開始し、その後コミットします。値が挿入されます。これにより、挿入中にエラーが発生した場合、変更が確実にロールバックされます。
  • 最適化実行: 準備されたステートメントとバインド操作をループの外に移動します。これにより、値が挿入されるたびにステートメントを準備するオーバーヘッドが軽減されます。

パフォーマンス評価

10,000 回の反復によるテストでは、トランザクションを使用した場合の大幅なパフォーマンスの向上が実証されています。 :

  • トランザクションなし: ~226秒
  • トランザクションあり: ~2 秒

この最適化手法により、速度が 2 桁向上し、MySQL への一括値挿入の効率的かつ安全なソリューションになります。 MySQLi を使用したデータベース

以上が速度とセキュリティのために MySQLi への一括データ挿入を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート