PHPのバルクインサート完全ガイド!初心者でもわかる複数データの一括処理と高速なデータベース操作
生徒
「PHPでたくさんのデータを一度にデータベースへ入れる方法ってありますか?1件ずつinsertすると遅いと聞いたことがあります。」
先生
「確かに1件ずつinsertすると時間がかかりますね。大量のデータを扱うときは“バルクインサート(bulk insert)”や“バッチ処理(batch processing)”を使うと、とても速くデータを登録できますよ。」
生徒
「バルクインサートってどういう仕組みなんですか?初心者でも使えますか?」
先生
「もちろんです。複数のデータをまとめて1回で送るだけなので、考え方は意外とシンプルです。具体的にわかりやすく説明していきますね。」
1. バルクインサートとは?初心者でもイメージしやすい一括処理の考え方
PHPのデータベース操作では、たくさんのデータを登録するときに処理時間が長くなることがあります。特に、1件ずつINSERTを実行する方法では、実行回数が増えるほど動作が重くなってしまいます。こうした問題を解決するのがバルクインサート(bulk insert)です。
バルクインサートとは、複数の行をまとめて1回のSQLで追加する方法です。たとえば、商品を100件登録する場合、100回INSERTを送るのではなく、1回のINSERTで100件をまとめて送るイメージです。
例えるなら、宅配便を100個バラバラに送るのではなく、まとめて1つの箱にして発送するようなものです。1件ずつ送るより、まとめたほうが速くて効率も良いわけです。
2. PHPとMySQLで実現するバルクインサートの基本構造
実際にPHPでバルクインサートを行う場合、INSERT文を下記のように複数行まとめて書きます。これはSQLの基本的な書き方で、データベース側が効率的に処理してくれます。
<?php
$sql = "INSERT INTO users (name, age) VALUES
('Taro', 20),
('Hanako', 25),
('Jiro', 30)";
?>
このように、VALUES の中をカンマでつないで複数行をまとめる方法が、もっともシンプルなバルクインサートです。
3. PHP(PDO)で配列データをバルクインサートする実践例
実際のシステム開発では、ユーザーの入力やCSVファイルのデータなど、配列で大量のデータを扱うことが多いです。ここでは初心者でも扱えるよう、配列からまとめてINSERTする例を紹介します。
<?php
$data = [
['Taro', 20],
['Hanako', 25],
['Jiro', 30],
];
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'user', 'pass');
$values = [];
$params = [];
foreach ($data as $index => $row) {
$values[] = "(?, ?)";
$params[] = $row[0];
$params[] = $row[1];
}
$sql = "INSERT INTO users (name, age) VALUES " . implode(",", $values);
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
?>
このコードでは、配列の数だけVALUESを増やし、それに合わせてパラメータもまとめて作成しています。これにより、何件でも一括でINSERTできる柔軟な仕組みになります。
4. トランザクションを使ってより安全なバッチ処理を行う方法
複数データを一括処理する場合、途中でエラーが起きたら「半分だけ登録される」という問題が発生します。こうした状態はデータの整合性を崩してしまい、エラーの原因になります。
これを防ぐために使うのがトランザクションです。トランザクションとは、処理のまとまりを作り、全部成功したら確定(commit)、途中で失敗したら元に戻す(rollback)という仕組みです。
<?php
$pdo->beginTransaction();
try {
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$pdo->commit();
} catch(Exception $e) {
$pdo->rollBack();
}
?>
初心者のうちは少し難しく感じるかもしれませんが、大量データを扱うシステムでは必ず使う重要な仕組みです。
5. MySQLiでバルクインサートを行う方法
PDO以外にMySQLiを使っているプロジェクトでもバルクインサートは可能です。基本的な考え方は同じで、SQLをまとめて生成して実行します。
<?php
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$sql = "INSERT INTO users (name, age) VALUES
('Taro', 20),
('Hanako', 25),
('Jiro', 30)";
$mysqli->query($sql);
?>
MySQLiを使う場合でも、複数データをまとめて送ることで処理速度が向上します。
6. なぜバルクインサートは速いのか?初心者向けの比喩で解説
バルクインサートが速くなる理由は「通信回数が減る」ためです。データベースとPHPの間では常に情報を行き来していますが、この通信回数が多いほど遅くなります。
これは、100回メールを送るより、1回でまとめて送ったほうが速いのと同じです。1件ずつ送るとPHPとデータベースが100回やり取りしますが、バルクインサートなら1回で済みます。
その結果、大量データの登録でもスムーズに処理できるようになります。